AsyncOperationManager.CreateOperation(Object) Método
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
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);
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, com uma operação assíncrona específica.
Retornos
Um AsyncOperation que pode ser usado para acompanhar a duração de uma invocação de método assíncrono.
Exemplos
O exemplo de código a seguir demonstra como usar o 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",
"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
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 realizará 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 eventos gerados durante a execução da operação assíncrona.
Cuidado
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 marcar para uma ID de tarefa não exclusiva e gerar um System.ArgumentException se for detectado.
Seu código deve acompanhar cada System.ComponentModel.AsyncOperation retornado por 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 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 que você marcar para 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.