Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        // 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;
        }