[英]Confused about WMI in .NET synchronous/asynchronous execution and results
[英]Asynchronous WMI Event handling in .NET
我正在嘗試使用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;
}
}
}
}
}
這個答案描述了一種實現非阻塞WaitForNextEvent()的方法
希望這可以幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.