AsyncOperation.Post(SendOrPostCallback, Object) Método

Definición

Invoca un delegado en el subproceso o contexto adecuado para el modelo de aplicaciones.Invokes a delegate on the thread or context appropriate for the application model.

public:
 void Post(System::Threading::SendOrPostCallback ^ d, System::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.A SendOrPostCallback object that wraps the delegate to be called when the operation ends.

arg
Object

Argumento del delegado incluido en el parámetro d.An argument for the delegate contained in the d parameter.

Excepciones

Se ha llamado anteriormente al método PostOperationCompleted(SendOrPostCallback, Object) para esta tarea.The PostOperationCompleted(SendOrPostCallback, Object) method has been called previously for this task.

d es null.d is null.

Ejemplos

En el ejemplo de código siguiente se muestra cómo usar el método Post para informar sobre el progreso y los resultados incrementales de una operación asincrónica.The following code example demonstrates using the Post method for reporting progress and incremental results of an asynchronous operation. Este ejemplo de código forma parte de un ejemplo más extenso proporcionado para la clase System.ComponentModel.AsyncOperationManager.This code example is part of a larger example provided for the System.ComponentModel.AsyncOperationManager class.

// 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 método Post invoca el delegado especificado por el parámetro arg sin finalizar la duración de la operación asincrónica.The Post method invokes the delegate specified by the arg parameter without ending the lifetime of the asynchronous operation.

Puede llamar al método Post tantas veces como desee mientras no haya finalizado la duración de la operación asincrónica mediante una llamada a PostOperationCompleted.You can call the Post method as often as you like while the lifetime of the asynchronous operation has not been ended by a call to PostOperationCompleted. Puede usar el método para notificar a los clientes el progreso o los resultados provisionales.You can use the method to report progress or interim results back to clients.

El parámetro d ajusta el delegado al que desea llamar cuando desea publicar una actualización sobre el estado de la tarea asincrónica.The d parameter wraps the delegate you want called when you want to post an update about the status of the asynchronous task. El objeto AsyncOperation garantizará que el delegado se invoca en el subproceso o contexto adecuado para el modelo de aplicación.The AsyncOperation object will ensure that your delegate is invoked on the thread or context appropriate for the application model. Opcionalmente, el método puede generar un evento que notifique a los clientes de un cambio de estado, una actualización del progreso o los resultados incrementales recién disponibles.Your method can optionally raise an event that notifies clients of a status change, progress update, or newly available incremental results.

El parámetro arg debe usarse para pasar el estado al delegado ajustado por el parámetro d.The arg parameter should be used to pass state to the delegate wrapped by the d parameter. Podría ser una referencia a un AsyncOperation, o podría ser un objeto System.ComponentModel.ProgressChangedEventArgs.It might be a reference to an AsyncOperation, or it might be a System.ComponentModel.ProgressChangedEventArgs object. Puede ser deseable derivar su propia clase de System.ComponentModel.ProgressChangedEventArgs para proporcionar almacenamiento de estado adicional.It may be desirable to derive your own class from System.ComponentModel.ProgressChangedEventArgs to provide additional state storage.

Notas a los desarrolladores de herederos

Los herederos deben hacer que la invocación de Post(SendOrPostCallback, Object) sea asincrónica, de modo que los proveedores de biblioteca de clases no tengan que preocuparse de los posibles desbordamientos de pila si suponen asincronía, pero un modelo de aplicación determinado es sincrónico.Inheritors must make the Post(SendOrPostCallback, Object) invocation asynchronous, so that class library providers do not need to concern themselves with potential stack overflows if they assume asynchrony but a particular application model happens to be synchronous.


Las aplicaciones de consola no sincronizan la ejecución de llamadas Post(SendOrPostCallback, Object).Console applications do not synchronize the execution of Post(SendOrPostCallback, Object) calls. Esto puede provocar que se generen eventos ProgressChanged fuera de lugar.This can cause ProgressChanged events to be raised out of order. Si desea serializar la ejecución de llamadas Post(SendOrPostCallback, Object), implemente e instale una clase SynchronizationContext.If you wish to have serialized execution of Post(SendOrPostCallback, Object) calls, implement and install a SynchronizationContext class.

Para obtener más información sobre la implementación de clases asincrónicas, vea [implementar el modelo asincrónico basado en eventos](~/docs/standard/asynchronous-programming-patterns/implementing-the-event-based-asynchronous-pattern.md).For more information about implementing asynchronous classes, see [Implementing the Event-based Asynchronous Pattern](~/docs/standard/asynchronous-programming-patterns/implementing-the-event-based-asynchronous-pattern.md).

Se aplica a

Consulte también: