AsyncOperationManager.CreateOperation(Object) Metod

Definition

Returnerar en AsyncOperation för att spåra varaktigheten för en viss asynkron åtgärd.

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

Parametrar

userSuppliedState
Object

Ett objekt som används för att associera ett klienttillstånd, till exempel ett aktivitets-ID, med en viss asynkron åtgärd.

Returer

Ett AsyncOperation som du kan använda för att spåra varaktigheten för en asynkron metodanrop.

Exempel

I följande kodexempel visas hur du använder CreateOperation metoden för att skapa en System.ComponentModel.AsyncOperation för att spåra varaktigheten för asynkrona åtgärder. Det här kodexemplet är en del av ett större exempel för AsyncOperationManager klassen.

// 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

Kommentarer

Metoden CreateOperation returnerar en System.ComponentModel.AsyncOperation som du kan använda för att spåra varaktigheten för en viss asynkron åtgärd och för att avisera programmodellen när åtgärden är klar. Du kan också använda den för att publicera förloppsuppdateringar och inkrementella resultat utan att avsluta åtgärden. System.ComponentModel.AsyncOperation Kommer korrekt att konvertera dessa anrop till lämplig tråd eller kontext för programmodellen.

Om du implementerar en klass som stöder det händelsebaserade asynkrona mönstret bör klassen anropa CreateOperation varje gång metoden MethodNameAsync anropas. Klientprogrammet som anropar metoden kan använda parametern userSuppliedState för att unikt identifiera varje anrop, för att särskilja händelser som utlöses under körningen av den asynkrona åtgärden.

Caution

Klientkoden måste ange ett unikt värde för parametern userSuppliedState . Icke-unika aktivitets-ID:er kan göra att implementeringen rapporterar förlopp och andra händelser felaktigt. Koden bör söka efter ett icke-unikt aktivitets-ID och generera ett System.ArgumentException om ett identifieras.

Koden bör spåra varje System.ComponentModel.AsyncOperation som returneras av CreateOperation och använda objektet i motsvarande underliggande asynkrona åtgärd för att publicera uppdateringar och avsluta åtgärden. Den här spårningen kan vara så enkel som att System.ComponentModel.AsyncOperation skicka som en parameter mellan ombud. I mer avancerade design kan klassen underhålla en samling System.ComponentModel.AsyncOperation objekt, lägga till objekt när aktiviteter startas och ta bort dem när aktiviteter slutförs eller avbryts. Med den här metoden kan du söka efter unika userSuppliedState parametervärden och är den metod som du bör använda när du arbetar med klasser som stöder flera samtidiga anrop.

Mer information om hur du implementerar asynkrona klasser finns i Implementera det händelsebaserade asynkrona mönstret.

Gäller för

Se även