AsyncOperation-Klasse
Assembly: System (in system.dll)
Wenn Sie eine Klasse entsprechend Übersicht über ereignisbasierte asynchrone Muster implementieren, müssen Sie möglicherweise die Lebensdauer der einzelnen asynchronen Vorgänge verfolgen, die in einer Instanz der Klasse aufgerufen wurden. Die AsyncOperation-Klasse bietet Möglichkeiten, den Fortschritt einer asynchronen Aufgabe zu verfolgen und darüber zu berichten.
In der folgenden Liste werden verschiedene Möglichkeiten der Verwendung eines AsyncOperation-Objekts dargestellt:
-
Rufen Sie Post vom asynchronen Worker-Code auf, um dem Client über Fortschritt und Zwischenergebnisse zu berichten.
-
Rufen Sie PostOperationCompleted auf, um anzugeben, dass eine asynchrone Aufgabe abgeschlossen wurde, oder um eine ausstehende asynchrone Aufgabe abzubrechen.
Die Klasse sollte ein AsyncOperation-Objekt für jede asynchrone Aufgabe abrufen, indem sie AsyncOperationManager.CreateOperation aufruft, wenn die Aufgabe beginnt. Damit der Client unterschiedliche asynchrone Aufgaben unterscheiden kann, verwendet AsyncOperationManager.CreateOperation einen Parameter für ein eindeutiges, vom Client bereitgestelltes Token, das zur UserSuppliedState-Eigenschaft wird. Sie kann dann über Clientcode für die Identifikation der bestimmten asynchronen Aufgabe verwendet werden, die Fortschritt oder Abschlussereignisse auslöst.
Hinweis: |
|---|
| Das auf diese Klasse angewendete HostProtectionAttribute-Attribut besitzt den Resources-Eigenschaftenwert SharedState. Das HostProtectionAttribute hat keine Auswirkungen auf Desktopanwendungen (die normalerweise durch Doppelklicken auf ein Symbol, Eingeben eines Befehls oder eines URL in einem Browser gestartet werden). Weitere Informationen finden Sie unter der HostProtectionAttribute-Klasse oder unter SQL Server-Programmierung und Hostschutzattribute. |
Im folgenden Codebeispiel wird die Verwendung eines AsyncOperation-Objekts zur Verfolgung der Lebensdauer asynchroner Vorgänge veranschaulicht. Dieses Codebeispiel ist Teil eines umfangreicheren Beispiels für die System.ComponentModel.AsyncOperationManager-Klasse.
Eine vollständige Codeauflistung finden Sie unter Gewusst wie: Implementieren einer Komponente, die das ereignisbasierte asynchrone Muster unterstützt. Eine vollständige Codeauflistung eines Clientformulars finden Sie unter Gewusst wie: Implementieren eines Clients des ereignisbasierten asynchronen Musters.
// This method starts an asynchronous calculation. // First, it checks the supplied task ID for uniqueness. // If taskId is unique, it creates a new WorkerEventHandler // and calls its BeginInvoke method to start the calculation. public virtual void CalculatePrimeAsync( int numberToTest, object taskId) { // Create an AsyncOperation for taskId. AsyncOperation asyncOp = AsyncOperationManager.CreateOperation(taskId); // Multiple threads will access the task dictionary, // so it must be locked to serialize access. lock (userStateToLifetime.SyncRoot) { if (userStateToLifetime.Contains(taskId)) { throw new ArgumentException( "Task ID parameter must be unique", "taskId"); } userStateToLifetime[taskId] = asyncOp; } // Start the asynchronous operation. WorkerEventHandler workerDelegate = new WorkerEventHandler(CalculateWorker); workerDelegate.BeginInvoke( numberToTest, asyncOp, null, null); }
// This method starts an asynchronous calculation.
// First, it checks the supplied task ID for uniqueness.
// If taskId is unique, it creates a new WorkerEventHandler
// and calls its BeginInvoke method to start the calculation.
public void CalculatePrimeAsync(int numberToTest, Object taskId)
{
// Create an AsyncOperation for taskId.
AsyncOperation asyncOp = AsyncOperationManager.CreateOperation(taskId);
synchronized (userStateToLifetime.get_SyncRoot())
{
// Multiple threads will access the task dictionary,
// so it must be locked to serialize access.
if (userStateToLifetime.Contains(taskId)) {
throw new ArgumentException("Task ID parameter must be unique",
"taskId");
}
userStateToLifetime.set_Item(taskId, asyncOp);
}
// Start the asynchronous operation.
WorkerEventHandler workerDelegate = new WorkerEventHandler(CalculateWorker);
workerDelegate.BeginInvoke(
numberToTest,
asyncOp,
null,
null);
}
Windows 98, Windows Server 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
Microsoft .NET Framework 3.0 wird unter Windows Vista, Microsoft Windows XP SP2 und Windows Server 2003 SP1 unterstützt.
Hinweis: