AsyncOperation.Post(SendOrPostCallback, Object) Método
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
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
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.
d es null.
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.