Compartir a través de


AsyncOperationManager.CreateOperation(Object) Método

Definición

Devuelve un objeto AsyncOperation para realizar un seguimiento de la duración de una operación asincrónica determinada.

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

Objeto que se utiliza para asociar un fragmento de estado del cliente, como un id. de tarea, a una operación asincrónica determinada.

Devoluciones

Objeto AsyncOperation que se puede utilizar para realizar un seguimiento de la duración de una invocación a un método asincrónico.

Ejemplos

En el ejemplo de código siguiente se muestra cómo usar el CreateOperation método para crear un System.ComponentModel.AsyncOperation para realizar un seguimiento de la duración de las operaciones asincrónicas. Este ejemplo de código es parte de un ejemplo más grande proporcionado para la clase 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", 
                "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

Comentarios

El CreateOperation método devuelve un System.ComponentModel.AsyncOperation que puede usar para realizar un seguimiento de la duración de una operación asincrónica determinada y para alertar al modelo de aplicación cuando se completa la operación. También puede usarlo para publicar actualizaciones de progreso y resultados incrementales sin terminar la operación. serializará System.ComponentModel.AsyncOperation correctamente estas llamadas al subproceso o contexto adecuado para el modelo de aplicación.

Si implementa una clase que admita el patrón asincrónico basado en eventos, la clase debe llamar CreateOperation cada vez que se llama al método MethodNameAsync . La aplicación cliente que realiza llamadas al método puede usar el userSuppliedState parámetro para identificar de forma única cada invocación, con el fin de distinguir los eventos generados durante la ejecución de la operación asincrónica.

Precaución

El código de cliente debe proporcionar un valor único para el userSuppliedState parámetro . Los identificadores de tarea no únicos pueden hacer que la implementación notifique el progreso y otros eventos incorrectamente. El código debe comprobar si hay un identificador de tarea no único y producir un System.ArgumentException si se detecta uno.

El código debe realizar un seguimiento de todos los System.ComponentModel.AsyncOperation devueltos por CreateOperation y usar el objeto en la operación asincrónica subyacente correspondiente para publicar actualizaciones y finalizar la operación. Este seguimiento puede ser tan sencillo como pasar como System.ComponentModel.AsyncOperation parámetro entre delegados. En diseños más sofisticados, la clase puede mantener una colección de System.ComponentModel.AsyncOperation objetos, agregar objetos cuando se inician tareas y quitarlos cuando se completan o se cancelan las tareas. Este enfoque le permite comprobar si hay valores de parámetro únicos userSuppliedState y es el método que debe usar al trabajar con clases que admiten varias invocaciones simultáneas.

Para obtener más información sobre cómo implementar clases asincrónicas, vea Implementación del patrón asincrónico basado en eventos.

Se aplica a

Consulte también