public Task <IEnumerable <PropertyDataCollection> > CollectAsync() { var tcs = new TaskCompletionSource <IEnumerable <PropertyDataCollection> >(); var watcher = new ManagementOperationObserver(); var results = new List <PropertyDataCollection>(); var readyHandler = new ObjectReadyEventHandler((sender, e) => { results.Add(e.NewObject.Properties); }); // The event handler that gets invoked by the watcher. var completedHandler = default(CompletedEventHandler); completedHandler = new CompletedEventHandler((sender, e) => { var tcsLocal = tcs; try { if (e.Status == ManagementStatus.NoError) { // The operation was completed without any errors. tcsLocal.SetResult(results); return; } if (e.Status == ManagementStatus.CallCanceled || e.Status == ManagementStatus.OperationCanceled) { // The task was cancelled before it could be completed. tcsLocal.SetCanceled(); return; } // An exception occurred during the operation. tcsLocal.SetException(new Exception($"Runtime error {e.Status}")); return; } finally { // Clean up the event handlers. watcher.Completed -= completedHandler; } }); // Wire up the event handler and begin the operation. watcher.ObjectReady += readyHandler; watcher.Completed += completedHandler; var management = new ManagementClass("Win32_LogicalDisk"); management.GetInstances(watcher); return(tcs.Task); }
// Does the async version of the enumeration in a synchronous way (apparently the usual sync version blocks things weirdly) public void EnumerateInstances(string queryString, ObjectReadyEventHandler myObserver) { AutoResetEvent finished = new AutoResetEvent(false); ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", queryString); ManagementOperationObserver observer = new ManagementOperationObserver(); observer.ObjectReady += myObserver; observer.Completed += (sender, obj) => // CompletedEventHandler(object sender, CompletedEventArgs obj) { finished.Set(); }; searcher.Get(observer); // Asynchronous finished.WaitOne(); return; }