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 aplicaciones.
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 contiene el delegado al que se va a llamar cuando finalice la operación.
- arg
- Object
Argumento del delegado incluido en el parámetro d
.
Excepciones
Se ha llamado anteriormente al método PostOperationCompleted(SendOrPostCallback, Object) 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 es parte de un ejemplo más grande proporcionado para la clase System.ComponentModel.AsyncOperationManager.
// 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 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 desee mientras la duración de la operación asincrónica no ha 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 quiere llamar cuando desee 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 se debe usar para pasar el estado al delegado encapsulado por el d
parámetro . Puede ser una referencia a un , AsyncOperationo podrí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 hacer que la Post(SendOrPostCallback, Object) invocación sea asincrónica, de modo que los proveedores de bibliotecas de clases no tengan que preocuparse por los posibles desbordamientos de pila si asumen asincronía, pero se produce una sincrónica en un modelo de aplicación determinado.
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 serializar la ejecución de llamadas Post(SendOrPostCallback, Object), implemente e instale una clase SynchronizationContext.
Para obtener más información sobre cómo implementar clases asincrónicas, vea Implementación del patrón asincrónico basado en eventos.