//======================================================================================= // // This source code is only intended as a supplement to existing Microsoft documentation. // // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY // KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR // PURPOSE. // // Copyright (C) Microsoft Corporation. All Rights Reserved. // //======================================================================================= // // Purpose: // Shows how use a separate thread to expand nodes and update the status and // progress bar. // //======================================================================================= // // Description: // Defines a new type of ScopeNode that adds 10 children to itself. It does this by // firing off a new Thread for the adding process. This adding routine then uses // SnapIn.Invoke to have a delegate actually add the node. // //======================================================================================= using System; using System.Configuration.Install; using System.ComponentModel; using System.Security.Permissions; using System.Threading; using Microsoft.ManagementConsole; [assembly: PermissionSetAttribute(SecurityAction.RequestMinimum, Unrestricted = true)] namespace Microsoft.ManagementConsole.Samples { /// /// RunInstaller attribute - Allows the .Net framework InstallUtil.exe to install the assembly. /// SnapInInstaller class - Installs snap-in for MMC. /// [RunInstaller(true)] public class InstallUtilSupport : SnapInInstaller { } /// /// SnapInSettings attribute - Used to set the registration information for the snap-in. /// SnapIn class - Provides the main entry point for the creation of a snap-in. /// AsyncExpandSnapIn class - snapin with nodes that expand on separate threads. /// [SnapInSettings("{BC2A078C-27DF-405b-BEF0-A5A87B83A557}", DisplayName = "- Threading Sample", Description = "Shows asynchronous expanding with progress.")] public class AsyncExpandSnapIn : SnapIn { /// /// Constructor /// public AsyncExpandSnapIn() { this.RootNode = new AsyncExpandNode(); this.RootNode.DisplayName = "Threading Sample - Asynchronous expansion on separate thread"; } } /// /// ScopeNode class - basic icon and name for item in scope pane /// AsyncExpandNode class - node which handles its expansion on a separate thread /// public class AsyncExpandNode : ScopeNode { private AsyncStatus expandStatus = null; /// /// Constructor /// public AsyncExpandNode() { } /// /// Launch new thread to handle expand tasks /// /// asynchronous status for updating the console protected override void OnExpand(AsyncStatus status) { // hang onto status expandStatus = status; // mark as expandStatus.EnableManualCompletion(); Thread thread = new Thread(new ThreadStart(Expand)); thread.Start(); } /// /// Add child nodes during expansion /// private void Expand() { int foundChildren = 10; // report progress expandStatus.ReportProgress(0, foundChildren, "Loading Sample children..."); // find results for (int child = 1; child < foundChildren; child++) { // The Thread.Sleep statement below is for demo purposes only. When doing your // development you should not block your snap-in thread to service an // async request like OnExpand unless you only use the scope tree and // list view and never show any WinForms views or WinForms property pages. // The reason is that your WinForms views and property pages will be blocked, // and in certain cases that can also block MMC. // sleep for a second Thread.Sleep(1000); // New scope nodes must be created on the snapin's thread DelegateWithNode delegateWithNode = new DelegateWithNode(AddChildNode); this.SnapIn.BeginInvoke(delegateWithNode, new object[] {this}); // update the progress expandStatus.ReportProgress(child, foundChildren, "Loading Sample children..."); } // update progress expandStatus.Complete("Loading Sample complete.", true); } private delegate void DelegateWithNode(AsyncExpandNode parentNode); /// /// Adding node on the snap-in thread although the Expand is in its own thread /// /// node to add under private void AddChildNode(AsyncExpandNode parentNode) { // add the child ScopeNode childNode = new AsyncExpandNode(); childNode.DisplayName = "Added " + System.DateTime.Now.ToLongTimeString(); this.Children.Add(childNode); } } } // namespace