AsyncOperation.Post(SendOrPostCallback, Object) Metodo

Definizione

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

d
SendOrPostCallback

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à.

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.

Si applica a

Vedi anche