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 contesto adeguato al 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 completamento dell'operazione.
- arg
- Object
Argomento per il delegato contenuto nel parametro d
.
Eccezioni
Il metodo PostOperationCompleted(SendOrPostCallback, Object) è già stato chiamato per l'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ù grande fornito per la 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
Commenti
Il Post metodo richiama il delegato specificato dal arg
parametro senza terminare la durata dell'operazione asincrona.
È possibile chiamare il Post metodo come si vuole mentre la durata dell'operazione asincrona non è stata terminata da una chiamata a PostOperationCompleted. È possibile usare il metodo per segnalare lo stato di avanzamento o i risultati intermedi ai client.
Il d
parametro esegue il wrapping del delegato che si vuole chiamare quando si vuole 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. Il metodo può generare facoltativamente un evento che informa i client di una modifica dello stato, dell'aggiornamento dello stato o dei risultati incrementali appena disponibili.
Il arg
parametro deve essere usato per passare lo stato al delegato sottoposto a wrapping dal d
parametro . Potrebbe trattarsi di un riferimento a un AsyncOperationoggetto oppure potrebbe essere un System.ComponentModel.ProgressChangedEventArgs oggetto . Può essere consigliabile derivare la propria classe da System.ComponentModel.ProgressChangedEventArgs per fornire un'archiviazione di stato aggiuntiva.
Note per gli eredi
Gli ereditatori 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 asincronità, ma un particolare modello di applicazione si verifica come sincrono.
Nota: le applicazioni console non sincronizzano l'esecuzione di Post(SendOrPostCallback, Object) chiamate. L'ordine di generazione degli eventi ProgressChanged
potrebbe quindi non essere corretto. Se si vuole l'esecuzione serializzata delle chiamate al metodo Post(SendOrPostCallback, Object), implementare e installare una classe SynchronizationContext.
Per altre informazioni sull'implementazione di classi asincrone, vedere Implementazione del modello asincrono basato su eventi.