AsyncOperation.Post(SendOrPostCallback, Object) Método

Definición

Invoca un delegado en el subproceso o contexto adecuado para el modelo de aplicación.

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 ajusta el delegado al que se va a llamar cuando finaliza la operación.

arg
Object

Argumento para el delegado contenido en el d parámetro .

Excepciones

Se ha llamado anteriormente al PostOperationCompleted(SendOrPostCallback, Object) método 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 forma parte de un ejemplo más grande proporcionado para la System.ComponentModel.AsyncOperationManager clase .

// This method computes the list of prime numbers used by the
// IsPrime method.
ArrayList BuildPrimeNumberList(
    int numberToTest,
    AsyncOperation asyncOp)
{
    ArrayList primes = [];
    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 int firstDivisor))
        {
            // Report to the client that a prime was found.
            ProgressChangedEventArgs e = new CalculatePrimeProgressChangedEventArgs(
                n,
                (int)(n / (float)numberToTest * 100),
                asyncOp.UserSuppliedState);

            asyncOp.Post(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 quiera mientras la duración de la operación asincrónica no haya 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 desea llamar cuando quiera 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 debe usarse para pasar el estado al delegado ajustado por el d parámetro . Puede ser una referencia a o AsyncOperationpodrí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 realizar la Post(SendOrPostCallback, Object) invocación asincrónica, de modo que los proveedores de bibliotecas de clases no necesiten preocuparse por los posibles desbordamientos de pila si asumen asincronía, pero un modelo de aplicación determinado puede ser sincrónico.

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 haber serializado la ejecución de Post(SendOrPostCallback, Object) llamadas, implemente e instale una SynchronizationContext clase.

Para obtener más información sobre la implementación de clases asincrónicas, vea Implementación del patrón asincrónico basado en eventos.

Se aplica a

Consulte también