Operations Manager Management Pack tasks can run in either a synchronous or an asynchronous mode. When an SDK client application runs a task in an asynchronous mode, the task runs in a separate thread. This allows the client to perform other operations while the task is running.

Example

  • The following example demonstrates how to asynchronously run a task to get the names of the rules and monitors that are running on all agent-managed computers in the Management Group.
Visual Basic  Copy Code
' Asynchronously runs a task to get a list of all 
' running rules or monitors on all agent-managed
' computers in the Management Group.
Imports System
Imports System.Collections.Generic
Imports System.Collections.ObjectModel
Imports Microsoft.EnterpriseManagement
Imports Microsoft.EnterpriseManagement.Administration
Imports Microsoft.EnterpriseManagement.Common
Imports Microsoft.EnterpriseManagement.Configuration
Imports Microsoft.EnterpriseManagement.Monitoring
Imports System.Xml
Imports System.Text


Namespace SDKSamples
	Class Program
		Public Shared mg As ManagementGroup = Nothing

		Public Overloads Shared Function Main(ByVal args() As String) As Integer

			mg = New ManagementGroup("localhost")

			Console.WriteLine("Asynchronously running a Management Pack task...")

			' Get the task.
			Dim query As String = "DisplayName = 'Show running rules and monitors for this health service'"
			Dim taskCriteria As New MonitoringTaskCriteria(query)
			Dim tasks As ReadOnlyCollection(Of MonitoringTask) = mg.GetMonitoringTasks(taskCriteria)
			Dim task As MonitoringTask = Nothing
			If tasks.Count = 1 Then
				task = tasks(0)
			Else
				Throw New InvalidOperationException("Error! Expected one task with: " + query)
			End If

			' Get the agent class.
			query = "Name = 'Microsoft.SystemCenter.ManagementServer'"
			Dim criteria As New MonitoringClassCriteria(query)
			Dim classes As ReadOnlyCollection(Of MonitoringClass) = mg.GetMonitoringClasses(criteria)
			If classes.Count <> 1 Then
				Throw New InvalidOperationException("Error! Expected one class with: " + query)
			End If

			' Create a MonitoringObject list containing all agents (the 
			' targets of the task).
			Dim targets As List(Of MonitoringObject) = New List(Of MonitoringObject)
			targets.AddRange(mg.GetMonitoringObjects(classes(0)))
			If targets.Count < 1 Then
				Throw New InvalidOperationException("Error! Expected at least one target.")
			End If

			' Use the default task configuration.
			Dim config As New MonitoringTaskConfiguration()

			' Run the task.
			Console.WriteLine(("Starting task """ + task.DisplayName + """ on the following targets: "))
			Dim target As MonitoringObject
			For Each target In targets
				Console.WriteLine(target.DisplayName)
			Next target

			Dim state As Object = Nothing
			Dim callback As New AsyncCallback(AddressOf New Program().OnAsyncTaskCallback)
			Dim result As IAsyncResult = mg.BeginExecuteMonitoringTask( _
				targets, task, config, callback, state)
			Console.WriteLine(("Task started on " + targets.Count.ToString() + " targets."))

			' Perform some operation while the tasks run, and wait for
			' the task results.
			System.Threading.Thread.Sleep(30000)
		End Function 'Main


		' The callback function is automatically called when the task is 
		' complete.
		Private Sub OnAsyncTaskCallback(ByVal result As IAsyncResult)
			Console.WriteLine("OnAsyncTaskCallback started.")

			' Get the task results.
			Dim results As ReadOnlyCollection(Of MonitoringTaskResult) = mg.EndExecuteMonitoringTask(result)
			If results.Count = 0 Then
				Throw New InvalidOperationException("Error! Failed to return any results.")
			End If
			' Display the task results.
			Dim resultNo As Integer = 0
			Dim taskResult As MonitoringTaskResult
			For Each taskResult In results
				resultNo += 1
				If taskResult.Status = TaskStatus.Failed Then
					Console.WriteLine("Target #" + resultNo.ToString() + " failed.")
					Console.WriteLine("Reason: " + taskResult.ErrorCode.Value.ToString())
				Else
					Console.WriteLine("Target #" + resultNo.ToString() + " succeeded.")

					' Convert the task Output element from a string to XML.
					Dim xmlDoc As New XmlDocument()
					xmlDoc.LoadXml(taskResult.Output)

					' Parse and display the output.
					Dim xPathQry As String = "/DataItem/Count"
					Dim countNode As System.Xml.XmlNode = xmlDoc.SelectSingleNode(xPathQry)
					Console.WriteLine("Target contains " + countNode.InnerText + " running rules or monitors.")
					xPathQry = "//Workflow"
					Dim instanceList As System.Xml.XmlNodeList = xmlDoc.SelectNodes(xPathQry)
					Dim cnt As Integer = 0
					Dim thisInstance As System.Xml.XmlNode
					For Each thisInstance In instanceList
						cnt += 1
						Console.WriteLine(cnt.ToString() + ". " + thisInstance.InnerText)
					Next thisInstance
				End If
			Next taskResult
		End Sub 'OnAsyncTaskCallback
	End Class 'Program
End Namespace 'SDKSamples
C#  Copy Code
/// <summary>
/// Asynchronously runs a task to get a list of all 
/// running rules or monitors on all agent-managed
/// computers in the Management Group.
/// </summary>
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using Microsoft.EnterpriseManagement;
using Microsoft.EnterpriseManagement.Administration;
using Microsoft.EnterpriseManagement.Common;
using Microsoft.EnterpriseManagement.Configuration;
using Microsoft.EnterpriseManagement.Monitoring;
using System.Xml;
using System.Text;

namespace SDKSamples
{
	class Program
	{
		public static ManagementGroup mg = null;

		static void Main(string[] args)
		{
			mg = new ManagementGroup("localhost");

			Console.WriteLine("Asynchronously running a Management Pack task...");

			// Get the task.
			string query = "DisplayName = 'Show running rules and monitors for this health service'";
			MonitoringTaskCriteria taskCriteria = new MonitoringTaskCriteria(query);
			ReadOnlyCollection<MonitoringTask> tasks =
				mg.GetMonitoringTasks(taskCriteria);
			MonitoringTask task = null;
			if (tasks.Count == 1)
				task = tasks[0];
			else
				throw new InvalidOperationException(
					"Error! Expected one task with: " + query);

			// Get the agent class.
			query = "Name = 'Microsoft.SystemCenter.ManagementServer'";
			MonitoringClassCriteria criteria = new MonitoringClassCriteria(query);
			ReadOnlyCollection<MonitoringClass> classes =
				mg.GetMonitoringClasses(criteria);
			if (classes.Count != 1)
				throw new InvalidOperationException(
					"Error! Expected one class with: " + query);

			// Create a MonitoringObject list containing all agents (the 
			// targets of the task).
			List<MonitoringObject> targets = new List<MonitoringObject>();
			targets.AddRange(mg.GetMonitoringObjects(classes[0]));
			if (targets.Count < 1)
				throw new InvalidOperationException(
					"Error! Expected at least one target.");

			// Use the default task configuration.
			MonitoringTaskConfiguration config = new MonitoringTaskConfiguration();

			// Run the task.
			Console.WriteLine("Starting task \"" + task.DisplayName +
				"\" on the following targets: ");
			foreach (MonitoringObject target in targets)
			{
				Console.WriteLine(target.DisplayName);
		}

			object state = null;
			IAsyncResult result = mg.BeginExecuteMonitoringTask(
				targets, task, config, new Program().OnAsyncTaskCallback, state);
			Console.WriteLine("Task started on " + targets.Count + " targets.");

			// Perform some operation while the tasks run, and wait for
			// the task results.
			System.Threading.Thread.Sleep(30000);

	}

		// The callback function is automatically called when the task is 
		// complete.
		private void OnAsyncTaskCallback(IAsyncResult result)
		{
			Console.WriteLine("OnAsyncTaskCallback started.");

			// Get the task results.
			ReadOnlyCollection<MonitoringTaskResult> results =
				mg.EndExecuteMonitoringTask(result);
			if (results.Count == 0)
				throw new InvalidOperationException("Error! Failed to return any results.");

			// Display the task results.
			int resultNo = 0;
			foreach (MonitoringTaskResult taskResult in results)
			{
				resultNo++;
				if (taskResult.Status == TaskStatus.Failed)
				{
					Console.WriteLine("Target #" + resultNo + " failed.");
					Console.WriteLine("Reason: " + taskResult.ErrorCode.Value);
			}
				else
				{
					Console.WriteLine("Target #" + resultNo + " succeeded.");

					// Convert the task Output element from a string to XML.
					XmlDocument xmlDoc = new XmlDocument();
					xmlDoc.LoadXml(taskResult.Output);

					// Parse and display the output.
					string xPathQry = @"/DataItem/Count";
					System.Xml.XmlNode countNode = xmlDoc.SelectSingleNode(xPathQry);
					Console.WriteLine("Target contains " + countNode.InnerText + " running rules or monitors.");
					xPathQry = @"//Workflow";
					System.Xml.XmlNodeList instanceList = xmlDoc.SelectNodes(xPathQry);
					int cnt = 0;
					foreach (System.Xml.XmlNode thisInstance in instanceList)
					{
						cnt++;
						Console.WriteLine(cnt.ToString() + ". " + thisInstance.InnerText);
				}
			}
		}
	}
}
}

See Also


Send comments about this topic to Microsoft.