AsyncOperationManager.CreateOperation(Object) Methode

Definition

Gibt für die Überwachung der Dauer eines bestimmten asynchronen Vorgangs eine AsyncOperation zurück.

public:
 static System::ComponentModel::AsyncOperation ^ CreateOperation(System::Object ^ userSuppliedState);
public static System.ComponentModel.AsyncOperation CreateOperation (object userSuppliedState);
public static System.ComponentModel.AsyncOperation CreateOperation (object? userSuppliedState);
static member CreateOperation : obj -> System.ComponentModel.AsyncOperation
Public Shared Function CreateOperation (userSuppliedState As Object) As AsyncOperation

Parameter

userSuppliedState
Object

Ein Objekt, das dazu verwendet wird, einem bestimmten asynchronen Vorgang einen Bestandteil des Clientzustands, z. B. eine Aufgaben-ID, zuzuordnen.

Gibt zurück

AsyncOperation

Eine AsyncOperation, die Sie verwenden können, um die Dauer eines asynchronen Methodenaufrufs zu verfolgen.

Beispiele

Im folgenden Codebeispiel wird die Verwendung der CreateOperation Methode zum Erstellen einer System.ComponentModel.AsyncOperation Nachverfolgung der Dauer asynchroner Vorgänge veranschaulicht. Dieses Codebeispiel ist Teil eines größeren Beispiels, das für die AsyncOperationManager Klasse bereitgestellt wird.

// 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 Overridable Sub CalculatePrimeAsync( _
    ByVal numberToTest As Integer, _
    ByVal taskId As Object)

    ' Create an AsyncOperation for taskId.
    Dim asyncOp As AsyncOperation = _
        AsyncOperationManager.CreateOperation(taskId)

    ' Multiple threads will access the task dictionary,
    ' so it must be locked to serialize access.
    SyncLock userStateToLifetime.SyncRoot
        If userStateToLifetime.Contains(taskId) Then
            Throw New ArgumentException( _
                "Task ID parameter must be unique", _
                "taskId")
        End If

        userStateToLifetime(taskId) = asyncOp
    End SyncLock

    ' Start the asynchronous operation.
    Dim workerDelegate As New WorkerEventHandler( _
        AddressOf CalculateWorker)

    workerDelegate.BeginInvoke( _
        numberToTest, _
        asyncOp, _
        Nothing, _
        Nothing)

End Sub

Hinweise

Die CreateOperation Methode gibt einen System.ComponentModel.AsyncOperation Wert zurück, mit dem Sie die Dauer eines bestimmten asynchronen Vorgangs nachverfolgen und das Anwendungsmodell benachrichtigen können, wenn der Vorgang abgeschlossen ist. Sie können es auch verwenden, um Fortschrittsupdates und inkrementelle Ergebnisse zu veröffentlichen, ohne den Vorgang zu beenden. Diese System.ComponentModel.AsyncOperation Aufrufe werden ordnungsgemäß an den entsprechenden Thread oder Kontext für das Anwendungsmodell gepostert.

Wenn Sie eine Klasse implementieren, die das ereignisbasierte asynchrone Muster unterstützt, sollte Ihre Klasse jedes Mal aufrufen CreateOperation , wenn Ihre MethodName-MethodeAsync aufgerufen wird. Die Clientanwendung, die Aufrufe an die Methode vornimmt, kann den userSuppliedState Parameter verwenden, um jede Aufrufe eindeutig zu identifizieren, damit Ereignisse unterschieden werden, die während der Ausführung des asynchronen Vorgangs ausgelöst werden.

Achtung

Clientcode muss einen eindeutigen Wert für den userSuppliedState Parameter bereitstellen. Nicht eindeutige Aufgaben-IDs können dazu führen, dass Ihre Implementierung den Fortschritt und andere Ereignisse falsch meldet. Ihr Code sollte nach einer nicht eindeutigen Aufgaben-ID suchen und einen System.ArgumentException auslösen, wenn eine erkannt wird.

Der Code sollte alle System.ComponentModel.AsyncOperation zurückgegebenen Elemente nachverfolgen CreateOperation und das Objekt im entsprechenden zugrunde liegenden asynchronen Vorgang verwenden, um Updates zu posten und den Vorgang zu beenden. Diese Nachverfolgung kann so einfach sein, dass der System.ComponentModel.AsyncOperation Parameter zwischen Stellvertretungen übergeben wird. In komplexeren Designs kann Ihre Klasse eine Sammlung von System.ComponentModel.AsyncOperation Objekten verwalten, Objekte hinzufügen, wenn Aufgaben gestartet und entfernt werden, wenn Aufgaben abgeschlossen oder abgebrochen werden. Mit diesem Ansatz können Sie nach eindeutigen userSuppliedState Parameterwerten suchen und ist die Methode, die Sie beim Arbeiten mit Klassen verwenden sollten, die mehrere gleichzeitige Aufrufe unterstützen.

Weitere Informationen zum Implementieren asynchroner Klassen finden Sie unter Implementieren des ereignisbasierten asynchronen Musters.

Gilt für

Siehe auch