AsyncOperation.Post(SendOrPostCallback, Object) Metodo
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Richiama un delegato nel thread o nel contesto appropriato per il modello di applicazione.
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)
Parametri
Oggetto SendOrPostCallback che esegue il wrapping del delegato da chiamare al termine dell'operazione.
- arg
- Object
Argomento per il delegato contenuto nel d parametro .
Eccezioni
Il PostOperationCompleted(SendOrPostCallback, Object) metodo è stato chiamato in precedenza per questa attività.
d è null.
Esempio
Nell'esempio di codice seguente viene illustrato l'uso del Post metodo per segnalare lo stato di avanzamento e i risultati incrementali di un'operazione asincrona. Questo esempio di codice fa parte di un esempio più ampio fornito per la 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
Commenti
Il Post metodo richiama il delegato specificato dal arg parametro senza terminare la durata dell'operazione asincrona.
È possibile chiamare il Post metodo con la frequenza desiderata mentre la durata dell'operazione asincrona non è stata terminata da una chiamata a PostOperationCompleted. È possibile utilizzare il metodo per segnalare lo stato di avanzamento o i risultati provvisori ai client.
Il d parametro esegue il wrapping del delegato che si desidera chiamare quando si desidera pubblicare un aggiornamento sullo stato dell'attività asincrona. L'oggetto AsyncOperation garantisce che il delegato venga richiamato nel thread o nel contesto appropriato per il modello di applicazione. Facoltativamente, il metodo può generare un evento che notifica ai client una modifica dello stato, un aggiornamento dello stato o i risultati incrementali appena disponibili.
Il arg parametro deve essere usato per passare lo stato al delegato di cui è stato eseguito il d wrapping dal parametro . Potrebbe trattarsi di un riferimento a un AsyncOperationoggetto o di un System.ComponentModel.ProgressChangedEventArgs oggetto . Potrebbe essere consigliabile derivare la propria classe da System.ComponentModel.ProgressChangedEventArgs per fornire spazio di archiviazione aggiuntivo dello stato.
Note per gli eredi
Gli eredi devono rendere asincrona la Post(SendOrPostCallback, Object) chiamata, in modo che i provider di librerie di classi non debbano preoccuparsi di potenziali overflow dello stack se presuppongono asincrona, ma un particolare modello di applicazione si verifica in modo sincrono.
Nota: le applicazioni console non sincronizzano l'esecuzione delle Post(SendOrPostCallback, Object) chiamate. Questo può causare che gli eventi ProgressChanged vengano generati fuori ordine. Se si vuole avere l'esecuzione serializzata delle Post(SendOrPostCallback, Object) chiamate, implementare e installare una SynchronizationContext classe .
Per altre informazioni sull'implementazione di classi asincrone, vedere Implementazione del modello asincrono basato su eventi.