Abonnement à des événements de gestion et consommation de ces événements
L'espace de noms System.Management fournit des fonctions permettant l'abonnement aux événements de gestion. Les événements WMI sont des notifications au sujet d'occurrences de conditions dans le système d'exploitation, les périphériques ou les applications dans l'environnement managé. Les clients de gestion peuvent s'abonner aux événements qui les intéressent en spécifiant une requête d'événement, qui définit le type des événements voulus ainsi qu'un ensemble de conditions pouvant être utilisées pour filtrer plus finement les événements communiqués. La consommation d'événements, elle aussi, peut s'effectuer de manière synchrone ou asynchrone. Pour plus d'informations sur les événements dans WMI, consultez la documentation WMI dans MSDN.
L'exemple de code suivant montre comment s'abonner à des événements WMI intrinsèques et les consommer de façon synchrone. Cet exemple construit une requête d'événement, l'utilise pour initialiser un objet ManagementEventWatcher, puis attend la livraison des événements correspondant au filtre spécifié.
using System;
using System.Management;
// This example shows synchronous consumption of events. The client
// is blocked while waiting for events. See additional example for
// asynchronous event handling.
public class EventWatcherPolling {
public static int Main(string[] args) {
// Create event query to be notified within 1 second of
// a change in a service
WqlEventQuery query =
new WqlEventQuery("__InstanceModificationEvent",
new TimeSpan(0,0,1),
"TargetInstance isa \"Win32_Service\"");
// Initialize an event watcher and subscribe to events
// that match this query
ManagementEventWatcher watcher = new ManagementEventWatcher(query);
// Block until the next event occurs
// Note: this can be done in a loop if waiting for
// more than one occurrence
ManagementBaseObject e = watcher.WaitForNextEvent();
//Display information from the event
Console.WriteLine(
"Service {0} has changed, State is {1}",
((ManagementBaseObject)e["TargetInstance"])["Name"],
((ManagementBaseObject)e["TargetInstance"])["State"]);
//Cancel the subscription
watcher.Stop();
return 0;
}
}
[Visual Basic]
Imports System
Imports System.Management
' This example shows synchronous consumption of events. The client
' is blocked while waiting for events. See additional example for
' asynchronous event handling.
Public Class EventWatcherPolling
Overloads Public Shared Function Main(args() As String) As Integer
' Create event query to be notified within 1 second of
' a change in a service
Dim query As New WqlEventQuery( _
"__InstanceModificationEvent", _
New TimeSpan(0, 0, 1), _
"TargetInstance isa ""Win32_Service""")
' Initialize an event watcher and subscribe to events
' that match this query
Dim watcher As New ManagementEventWatcher(query)
'Block until the next event occurs
'Note: this can be done in a loop if waiting for more
' than one occurrence
Dim e As ManagementBaseObject = watcher.WaitForNextEvent()
'Display information from the event
Console.WriteLine( _
"Service {0} has changed, State is {1}", _
CType(e("TargetInstance"), ManagementBaseObject)("Name"), _
CType(e("TargetInstance"), ManagementBaseObject)("State"))
'Cancel the subscription
watcher.Stop()
Return 0
End Function 'Main
End Class 'EventWatcherPolling
L'exemple de code suivant consomme des événements de manière asynchrone. Dans ce cas, comme il utilise des événements Timer, l'exemple configure aussi une minuterie WMI pour déclencher un événement toutes les secondes et le supprime quand il n'en a plus besoin. L'objet ManagementEventWatcher définit plusieurs événements .NET Framework qui sont déclenchés lors de la livraison d'événements WMI. Des délégués sont attachés à ces événements pour traiter les données entrantes.
using System;
using System.Management;
// This example shows asynchronous consumption of events. In this example
// you are listening for timer events. The first part of the example sets
// up the timer.
public class EventWatcherAsync {
public static int Main(string[] args) {
// Set up a timer to raise events every 1 second
//=============================================
ManagementClass timerClass =
new ManagementClass("__IntervalTimerInstruction");
ManagementObject timer = timerClass.CreateInstance();
timer["TimerId"] = "Timer1";
timer["IntervalBetweenEvents"] = 1000;
timer.Put();
// Set up the event consumer
//==========================
// Create event query to receive timer events
WqlEventQuery query =
new WqlEventQuery("__TimerEvent", "TimerId=\"Timer1\"");
// Initialize an event watcher and subscribe to
// events that match this query
ManagementEventWatcher watcher = new ManagementEventWatcher(query);
// Set up a listener for events
watcher.EventArrived +=
new EventArrivedEventHandler((new EventHandler()).HandleEvent);
// Start listening
watcher.Start();
// Do something in the meantime
System.Threading.Thread.Sleep(10000);
// Stop listening
watcher.Stop();
return 0;
}
}
public class EventHandler {
public void HandleEvent(object sender, EventArrivedEventArgs e) {
Console.WriteLine("Event arrived !");
}
}
[Visual Basic]
Imports System
Imports System.Management
' This example shows asynchronous consumption of events. In this example
' you are listening for timer events. The first part of the example sets
' up the timer.
Public Class EventWatcherAsync
Overloads Public Shared Function Main(args() As String) As Integer
' Set up a timer to raise events every 1 second
'=============================================
Dim timerClass As New ManagementClass("__IntervalTimerInstruction")
Dim timer As ManagementObject = timerClass.CreateInstance()
timer("TimerId") = "Timer1"
timer("IntervalBetweenEvents") = 1000
timer.Put()
' Set up the event consumer
'==========================
' Create event query to receive timer events
Dim query As New WqlEventQuery("__TimerEvent", "TimerId=""Timer1""")
' Initialize an event watcher and subscribe to
' events that match this query
Dim watcher As New ManagementEventWatcher(query)
' Set up a listener for events
Dim handler As New EventHandler()
AddHandler watcher.EventArrived, AddressOf handler.HandleEvent
' Start listening
watcher.Start()
' Do something in the meantime
System.Threading.Thread.Sleep(10000)
' Stop listening
watcher.Stop()
Return 0
End Function
End Class
Public Class EventHandler
Public Sub HandleEvent(sender As Object, e As EventArrivedEventArgs)
Console.WriteLine("Event arrived !")
End Sub
End Class
Voir aussi
Accès aux informations de gestion avec System.Management | Extraction de collections d'objets de gestion | Soumission de requêtes pour obtenir des informations de gestion | Exécution de méthodes sur des objets de gestion | Options d'accès distant et de connexion | Utilisation d'objets fortement typés