AsyncOperationManager.CreateOperation(Object) Metoda

Definice

AsyncOperation Vrátí hodnotu pro sledování doby trvání konkrétní asynchronní operace.

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

Parametry

userSuppliedState
Object

Objekt použitý k přidružení části stavu klienta, například ID úlohy, ke konkrétní asynchronní operaci.

Návraty

Můžete AsyncOperation použít ke sledování doby trvání vyvolání asynchronní metody.

Příklady

Následující příklad kódu ukazuje použití CreateOperation metody k vytvoření System.ComponentModel.AsyncOperation pro sledování doby trvání asynchronních operací. Tento příklad kódu je součástí většího příkladu uvedeného pro třídu AsyncOperationManager.

// 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",
                nameof(taskId));
        }

        userStateToLifetime[taskId] = asyncOp;
    }

    // Start the asynchronous operation.
    WorkerEventHandler workerDelegate = new(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

Poznámky

Metoda CreateOperation vrátí metodu System.ComponentModel.AsyncOperation , kterou můžete použít ke sledování doby trvání konkrétní asynchronní operace a k upozorňování aplikačního modelu po dokončení operace. Můžete ho také použít k publikování probíhajících aktualizací a přírůstkových výsledků bez ukončení operace. Správně System.ComponentModel.AsyncOperation zařadí tato volání do příslušného vlákna nebo kontextu pro aplikační model.

Pokud implementujete třídu, která podporuje asynchronní vzor založený na událostech, vaše třída by měla volat CreateOperation pokaždé, když je volána metoda MethodNameAsync . Klientská aplikace, která volá metodu, může pomocí parametru userSuppliedState jednoznačně identifikovat každé vyvolání, aby bylo možné rozlišit události vyvolané během provádění asynchronní operace.

Caution

Klientský kód musí poskytnout jedinečnou hodnotu parametru userSuppliedState . Id ne jedinečných úkolů můžou způsobit, že vaše implementace hlásí průběh a jiné události nesprávně. Váš kód by měl zkontrolovat id úkolu, které není jedinečné, a vyvolat System.ArgumentException chybu, pokud je zjištěna.

Váš kód by měl sledovat všechny System.ComponentModel.AsyncOperation vrácené objekty CreateOperation a používat ho v odpovídající asynchronní operaci k publikování aktualizací a ukončení operace. Toto sledování může být stejně jednoduché jako předání parametru System.ComponentModel.AsyncOperation mezi delegáty. Ve složitějších System.ComponentModel.AsyncOperation návrzích může vaše třída udržovat kolekci objektů, přidávat objekty při spuštění úkolů a odebírat je při dokončení nebo zrušení úkolů. Tento přístup umožňuje zkontrolovat jedinečné userSuppliedState hodnoty parametrů a je to metoda, kterou byste měli použít při práci s třídami, které podporují více souběžných vyvolání.

Další informace o implementaci asynchronních tříd naleznete v tématu Implementace asynchronního vzoru založeného na událostech.

Platí pro

Viz také