.NET中的异步WMI事件处理

时间:2012-08-28 13:09:54

标签: .net asynchronous permissions wmi remote-process

我正在尝试使用WMI远程运行某些进程并等待进程完成。目前,事件观察器使用WaitForNextEvent进行半同步,如果程序发生某些事情,它也会超时。这一切都运作良好。我尝试将其修改为异步事件处理,但在启动事件观察器时出现Access Denied错误。现在这不是什么大问题,因为我可以坚持使用半同步方法,但有一个例外。

如果由于某种原因,在执行程序期间机器重新启动,冻结或丢失网络连接,WaitForNextEvent不会抛出超时异常,但会无限期地阻塞线程(我把它留在那里没有回答10分钟,超时30秒)。我的问题是:有没有人知道是否可以以特定方式设置事件观察器以便无论连接如何都超时,或者设置客户端以便能够访问异步权限。通常情况下,第一个是首选,但第二个也是一个选项。

ManagementEventWatcher w = new ManagementEventWatcher(managementScope,
    new WqlEventQuery(
        "select * from Win32_ProcessStopTrace where ProcessId=" + ProcessId));

w.Options.Timeout = new TimeSpan(0, 0, 0, 30);

var ev = w.WaitForNextEvent();

我想知道ManagementeventWatcher是否有一些选项可以返回或超时,无论连接如何,或者是否可以使用异步方法来捕获事件。

解决方案

ManagementEventWatcher w = new ManagementEventWatcher(managementScope,
    new WqlEventQuery(
        "select * from Win32_ProcessStopTrace where ProcessId=" + ProcessId));

w.Options.Timeout = new TimeSpan(0, 0, 0, 0, 1);
DateTime start = DateTime.Now;
while (Status == StatusNotStarted) //default status(just strings)
{
    try
    {
        var ev = w.WaitForNextEvent();
        ReturnCode = (uint)ev.Properties["ExitStatus"].Value;
        Status = (ReturnCode == 0) ? StatusOk : StatusFailed;
    }
    catch (ManagementException ex)
    {
        if (!ex.Message.Contains("Timed out"))
        {
            throw ex;
        }
        try
        {
            Ping p = new Ping();
            PingReply reply = p.Send(MachineIP);
            if (reply.Status != IPStatus.Success)
            {
                Status = StatusFailed;
            }
            else
            {
                DateTime end = DateTime.Now;
                TimeSpan duration = end - start;
                if (duration.TotalMilliseconds > Timeout)
                {
                    Status = StatusFailed;
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

相关问题