AsyncOperation.Post(SendOrPostCallback, Object) Método

Definição

Invoca um delegado no thread ou contexto apropriado para o modelo de aplicação.

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

Um SendOrPostCallback objeto que envolve o delegado a ser chamado quando a operação termina.

arg
Object

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

Exceções

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

Exemplos

O exemplo de código seguinte demonstra a utilização do Post método para reportar progresso e 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.
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

Observações

O Post método invoca o delegado especificado pelo arg parâmetro sem terminar a vida útil da operação assíncrona.

Pode chamar o Post método quantas vezes quiser enquanto a vida útil da operação assíncrona não foi terminada por uma chamada para PostOperationCompleted. Pode usar o método para reportar o progresso ou resultados intermédios aos clientes.

O d parâmetro envolve o delegado que quer chamar quando quer publicar uma atualização sobre o estado da tarefa assíncrona. O AsyncOperation objeto garantirá que o seu delegado é invocado no thread ou contexto apropriado para o modelo de aplicação. O seu método pode, opcionalmente, gerar um evento que notifique os clientes de uma alteração de estado, atualização de progresso ou novos resultados incrementais disponíveis.

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

Notas para Herdeiros

Os herdeiros devem tornar a Post(SendOrPostCallback, Object) invocação assíncrona, para que os fornecedores de bibliotecas de classes não tenham de se preocupar com potenciais excessos de pilha se assumirem assíncronia, mas um determinado modelo de aplicação for síncrono.

Nota: As aplicações de consola não sincronizam a execução das Post(SendOrPostCallback, Object) chamadas. Isso pode fazer com que os eventos ProgressChanged ocorram fora de ordem. Se você deseja ter a execução serializada de Post(SendOrPostCallback, Object) chamadas, implemente e instale uma SynchronizationContext classe.

Para mais informações sobre a implementação de classes assíncronas, consulte Implementação do Padrão Assíncrono Baseado em Eventos.

Aplica-se a

Ver também