AsyncOperationManager.CreateOperation(Object) Método

Definição

Retorna um AsyncOperation para acompanhar a duração de uma operação assíncrona específica.

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

Parâmetros

userSuppliedState
Object

Um objeto usado para associar uma parte do estado do cliente, como uma ID de tarefa, a uma operação assíncrona específica.

Retornos

Um AsyncOperation que você pode usar para acompanhar a duração de uma invocação de método assíncrono.

Exemplos

O exemplo de código a seguir demonstra o uso do CreateOperation método para criar um System.ComponentModel.AsyncOperation para acompanhar a duração das operações assíncronas. Este exemplo de código faz parte de um exemplo maior fornecido para a 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

Comentários

O CreateOperation método retorna um System.ComponentModel.AsyncOperation que você pode usar para acompanhar a duração de uma operação assíncrona específica e alertar o modelo de aplicativo quando a operação for concluída. Você também pode usá-lo para postar atualizações de progresso e resultados incrementais sem encerrar a operação. O System.ComponentModel.AsyncOperation marshaling correto dessas chamadas para o thread ou contexto apropriado para o modelo de aplicativo.

Se você implementar uma classe que dê suporte ao Padrão Assíncrono baseado em evento, sua classe deverá chamar CreateOperation cada vez que o método MethodNameAsync for chamado. O aplicativo cliente que faz chamadas para o método pode usar o userSuppliedState parâmetro para identificar exclusivamente cada invocação, de modo a distinguir os eventos gerados durante a execução da operação assíncrona.

Caution

O código do cliente deve fornecer um valor exclusivo para o userSuppliedState parâmetro. IDs de tarefa não exclusivas podem fazer com que sua implementação relate o progresso e outros eventos incorretamente. Seu código deve verificar se há uma ID de tarefa não exclusiva e gerar uma System.ArgumentException se for detectada.

Seu código deve acompanhar todos os System.ComponentModel.AsyncOperation retornados CreateOperation e usar o objeto na operação assíncrona subjacente correspondente para postar atualizações e encerrar a operação. Esse acompanhamento pode ser tão simples quanto passar o System.ComponentModel.AsyncOperation parâmetro como um parâmetro entre delegados. Em designs mais sofisticados, sua classe pode manter uma coleção de System.ComponentModel.AsyncOperation objetos, adicionando objetos quando as tarefas são iniciadas e removendo-os quando as tarefas são concluídas ou canceladas. Essa abordagem permite verificar valores de parâmetro exclusivos userSuppliedState e é o método que você deve usar ao trabalhar com classes que dão suporte a várias invocações simultâneas.

Para obter mais informações sobre como implementar classes assíncronas, consulte Implementando o padrão assíncrono baseado em evento.

Aplica-se a

Confira também