Compartir a través de


AsyncOperation.Post(SendOrPostCallback, Object) Método

Definición

Invoca un delegado en el subproceso o contexto adecuado para el modelo de aplicaciones.

public:
 void Post(System::Threading::SendOrPostCallback ^ d, System::Object ^ arg);
public void Post (System.Threading.SendOrPostCallback d, object arg);
public void Post (System.Threading.SendOrPostCallback d, object? arg);
member this.Post : System.Threading.SendOrPostCallback * obj -> unit
Public Sub Post (d As SendOrPostCallback, arg As Object)

Parámetros

d
SendOrPostCallback

Objeto SendOrPostCallback que contiene el delegado al que se va a llamar cuando finalice la operación.

arg
Object

Argumento del delegado incluido en el parámetro d.

Excepciones

Se ha llamado anteriormente al método PostOperationCompleted(SendOrPostCallback, Object) para esta tarea.

Ejemplos

En el ejemplo de código siguiente se muestra el uso del Post método para notificar el progreso y los resultados incrementales de una operación asincrónica. Este ejemplo de código es parte de un ejemplo más grande proporcionado para la clase System.ComponentModel.AsyncOperationManager.

// This method computes the list of prime numbers used by the
// IsPrime method.
private ArrayList BuildPrimeNumberList(
    int numberToTest,
    AsyncOperation asyncOp)
{
    ProgressChangedEventArgs e = null;
    ArrayList primes = new ArrayList();
    int firstDivisor;
    int n = 5;

    // Add the first prime numbers.
    primes.Add(2);
    primes.Add(3);

    // Do the work.
    while (n < numberToTest && 
           !TaskCanceled( asyncOp.UserSuppliedState ) )
    {
        if (IsPrime(primes, n, out firstDivisor))
        {
            // Report to the client that a prime was found.
            e = new CalculatePrimeProgressChangedEventArgs(
                n,
                (int)((float)n / (float)numberToTest * 100),
                asyncOp.UserSuppliedState);

            asyncOp.Post(this.onProgressReportDelegate, e);

            primes.Add(n);

            // Yield the rest of this time slice.
            Thread.Sleep(0);
        }

        // Skip even numbers.
        n += 2;
    }

    return primes;
}
' This method computes the list of prime numbers used by the
' IsPrime method.
Private Function BuildPrimeNumberList( _
    ByVal numberToTest As Integer, _
    ByVal asyncOp As AsyncOperation) As ArrayList

    Dim e As ProgressChangedEventArgs = Nothing
    Dim primes As New ArrayList
    Dim firstDivisor As Integer
    Dim n As Integer = 5

    ' Add the first prime numbers.
    primes.Add(2)
    primes.Add(3)

    ' Do the work.
    While n < numberToTest And _
        Not Me.TaskCanceled(asyncOp.UserSuppliedState)

        If IsPrime(primes, n, firstDivisor) Then
            ' Report to the client that you found a prime.
            e = New CalculatePrimeProgressChangedEventArgs( _
                n, _
                CSng(n) / CSng(numberToTest) * 100, _
                asyncOp.UserSuppliedState)

            asyncOp.Post(Me.onProgressReportDelegate, e)

            primes.Add(n)

            ' Yield the rest of this time slice.
            Thread.Sleep(0)
        End If

        ' Skip even numbers.
        n += 2

    End While

    Return primes

End Function

Comentarios

El Post método invoca el delegado especificado por el arg parámetro sin finalizar la duración de la operación asincrónica.

Puede llamar al Post método con tanta frecuencia como desee mientras la duración de la operación asincrónica no ha finalizado mediante una llamada a PostOperationCompleted. Puede usar el método para notificar el progreso o los resultados provisionales a los clientes.

El d parámetro ajusta el delegado al que quiere llamar cuando desee publicar una actualización sobre el estado de la tarea asincrónica. El AsyncOperation objeto garantizará que el delegado se invoque en el subproceso o contexto adecuado para el modelo de aplicación. El método puede generar opcionalmente un evento que notifique a los clientes un cambio de estado, una actualización de progreso o resultados incrementales recién disponibles.

El arg parámetro se debe usar para pasar el estado al delegado encapsulado por el d parámetro . Puede ser una referencia a un , AsyncOperationo podría ser un System.ComponentModel.ProgressChangedEventArgs objeto . Puede ser conveniente derivar su propia clase de System.ComponentModel.ProgressChangedEventArgs para proporcionar almacenamiento de estado adicional.

Notas a los desarrolladores de herederos

Los heredadores deben hacer que la Post(SendOrPostCallback, Object) invocación sea asincrónica, de modo que los proveedores de bibliotecas de clases no tengan que preocuparse por los posibles desbordamientos de pila si asumen asincronía, pero se produce una sincrónica en un modelo de aplicación determinado.

Nota: Las aplicaciones de consola no sincronizan la ejecución de Post(SendOrPostCallback, Object) llamadas. Esto puede provocar que se generen eventos ProgressChanged fuera de lugar. Si desea serializar la ejecución de llamadas Post(SendOrPostCallback, Object), implemente e instale una clase SynchronizationContext.

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