Partilhar via


AsyncOperation.Post(SendOrPostCallback, Object) Método

Definição

Invoca um delegado no thread ou contexto apropriado para o modelo de aplicativo.

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

Um objeto SendOrPostCallback que encapsula o delegado a ser chamado quando a operação é encerrada.

arg
Object

Um argumento para o delegado contido no parâmetro d.

Exceções

O método PostOperationCompleted(SendOrPostCallback, Object) foi chamado anteriormente para essa tarefa.

Exemplos

O exemplo de código a seguir demonstra o uso do método para relatar o Post progresso e os resultados incrementais de uma operação assíncrona. Este exemplo de código faz parte de um exemplo maior fornecido para a System.ComponentModel.AsyncOperationManager classe .

// 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

Comentários

O Post método invoca o delegado especificado pelo arg parâmetro sem encerrar o tempo de vida da operação assíncrona.

Você pode chamar o método com a Post frequência que desejar, enquanto o tempo de vida da operação assíncrona não foi encerrado por uma chamada para PostOperationCompleted. Você pode usar o método para relatar o progresso ou os resultados provisórios de volta aos clientes.

O d parâmetro encapsula o delegado que você deseja chamar quando você deseja postar uma atualização sobre o status da tarefa assíncrona. O AsyncOperation objeto garantirá que o delegado seja invocado no thread ou no contexto apropriado para o modelo de aplicativo. Opcionalmente, seu método pode gerar um evento que notifica os clientes de uma alteração status, atualização de progresso ou resultados incrementais recém-disponíveis.

O arg parâmetro deve ser usado para passar o estado para o delegado encapsulado pelo d parâmetro . Pode ser uma referência a um AsyncOperationou pode ser um System.ComponentModel.ProgressChangedEventArgs objeto . Pode ser desejável derivar sua própria classe de System.ComponentModel.ProgressChangedEventArgs para fornecer armazenamento de estado adicional.

Notas aos Herdeiros

Os herdadores devem tornar a Post(SendOrPostCallback, Object) invocação assíncrona, para que os provedores de biblioteca de classes não precisem se preocupar com possíveis estouros de pilha se assumirem assíncrona, mas um modelo de aplicativo específico for síncrono.

Observação: os aplicativos de console não sincronizam a execução de Post(SendOrPostCallback, Object) chamadas. Isso pode fazer com que os eventos ProgressChanged sejam gerados fora de ordem. Se quiser que as chamadas Post(SendOrPostCallback, Object) sejam executadas em série, implemente e instale uma classe SynchronizationContext.

Para obter mais informações sobre como implementar classes assíncronas, consulte Implementando o padrão assíncrono baseado em evento.

Aplica-se a

Confira também