gpt4 book ai didi

.net - .NET 中的异步 WMI 事件处理

转载 作者:行者123 更新时间:2023-12-03 03:27:01 26 4
gpt4 key购买 nike

我正在尝试使用 WMI 远程运行一些进程并等待进程完成。目前,事件观察器是使用 WaitForNextEvent 半同步的,它也有一个超时,以防程序发生问题。这一切都运作良好。我尝试将其修改为异步事件处理,但在启动事件观察程序时收到“访问被拒绝”错误。现在这不是什么大问题,因为我可以坚持使用半同步方法,但有一个异常(exception)。

如果由于某种原因,在程序执行过程中机器重新启动、卡住或失去网络连接,WaitForNextEvent 不会抛出超时异常,而是无限期地阻塞线程(I留在那里 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;
}
}
}
}
}

最佳答案

关于.net - .NET 中的异步 WMI 事件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12159989/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com