AsyncOperation.Post(SendOrPostCallback, Object) Método
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
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
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.
d
é null
.
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.