Condividi tramite


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ù ampio 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 con la frequenza desiderata 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 provvisori ai client.

Il d parametro esegue il wrapping del delegato che si desidera 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ò facoltativamente 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 wrapping dal d parametro . Potrebbe trattarsi di un riferimento a un AsyncOperationoggetto o di un System.ComponentModel.ProgressChangedEventArgs oggetto . Può essere consigliabile derivare una classe personalizzata da System.ComponentModel.ProgressChangedEventArgs per fornire spazio di archiviazione dello stato aggiuntivo.

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 è sincrono.

Nota: le applicazioni console non sincronizzano l'esecuzione delle 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