AsyncOperation.Post(SendOrPostCallback, Object) Metodo

Definizione

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

d
SendOrPostCallback

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

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.

Si applica a

Vedi anche