AsyncOperationManager.CreateOperation(Object) Metodo

Definizione

Restituisce un oggetto AsyncOperation per tenere traccia della durata di un'operazione asincrona specifica.

public:
 static System::ComponentModel::AsyncOperation ^ CreateOperation(System::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

Parametri

userSuppliedState
Object

Oggetto utilizzato per associare un elemento di stato client, ad esempio un ID attività, a una particolare operazione asincrona.

Valori restituiti

Oggetto AsyncOperation che è possibile usare per tenere traccia della durata di una chiamata al metodo asincrono.

Esempio

Nell'esempio di codice seguente viene illustrato l'utilizzo del CreateOperation metodo per creare un System.ComponentModel.AsyncOperation oggetto per tenere traccia della durata delle operazioni asincrone. Questo esempio di codice fa parte di un esempio più ampio fornito per la AsyncOperationManager classe .

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

Commenti

Il CreateOperation metodo restituisce un oggetto System.ComponentModel.AsyncOperation che è possibile usare per tenere traccia della durata di un'operazione asincrona specifica e per avvisare il modello di applicazione al termine dell'operazione. È anche possibile usarlo per pubblicare gli aggiornamenti dello stato di avanzamento e i risultati incrementali senza terminare l'operazione. Eseguirà System.ComponentModel.AsyncOperation correttamente il marshalling di queste chiamate al thread o al contesto appropriato per il modello di applicazione.

Se si implementa una classe che supporta il modello asincrono basato su eventi, la classe deve chiamare ogni volta che viene chiamato CreateOperation il metodo MethodNameAsync . L'applicazione client che effettua chiamate al metodo può usare il userSuppliedState parametro per identificare in modo univoco ogni chiamata, in modo da distinguere gli eventi generati durante l'esecuzione dell'operazione asincrona.

Attenzione

Il codice client deve fornire un valore univoco per il userSuppliedState parametro . Gli ID attività non univoci possono causare l'implementazione di segnalare lo stato di avanzamento e altri eventi in modo errato. Il codice deve verificare la presenza di un ID attività non univoco e generare un'eccezione System.ArgumentException se ne viene rilevata una.

Il codice deve tenere traccia di ogni System.ComponentModel.AsyncOperation oggetto restituito da CreateOperation e usare l'oggetto nell'operazione asincrona sottostante corrispondente per pubblicare gli aggiornamenti e terminare l'operazione. Questo rilevamento può essere semplice come passare come System.ComponentModel.AsyncOperation parametro tra delegati. Nelle progettazioni più sofisticate, la classe può gestire una raccolta di System.ComponentModel.AsyncOperation oggetti, aggiungendo oggetti all'avvio e rimuovendoli quando le attività vengono completate o annullate. Questo approccio consente di verificare la presenza di valori di parametro univoci userSuppliedState ed è il metodo da usare quando si usano classi che supportano più chiamate simultanee.

Per altre informazioni sull'implementazione di classi asincrone, vedere Implementazione del modello asincrono basato su eventi.

Si applica a

Vedi anche