Udostępnij za pośrednictwem


AsyncOperation.Post(SendOrPostCallback, Object) Metoda

Definicja

Wywołuje delegata w wątku lub kontekście odpowiednim dla modelu aplikacji.

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)

Parametry

d
SendOrPostCallback

SendOrPostCallback Obiekt, który opakowuje delegata do wywołania po zakończeniu operacji.

arg
Object

Argument delegata zawartego w parametrze d .

Wyjątki

Metoda PostOperationCompleted(SendOrPostCallback, Object) została wywołana wcześniej dla tego zadania.

Przykłady

Poniższy przykład kodu pokazuje użycie Post metody raportowania postępu i przyrostowych wyników operacji asynchronicznej. Ten przykład kodu jest częścią większego przykładu podanego System.ComponentModel.AsyncOperationManager dla klasy.

// 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

Uwagi

Metoda Post wywołuje delegata określonego arg przez parametr bez zakończenia okresu istnienia operacji asynchronicznej.

Możesz wywołać metodę Post tak często, jak chcesz, podczas gdy okres istnienia operacji asynchronicznej nie został zakończony przez wywołanie metody PostOperationCompleted. Możesz użyć metody , aby zgłosić postęp lub tymczasowe wyniki z powrotem do klientów.

d Parametr opakowuje delegata, który chcesz wywołać, gdy chcesz opublikować aktualizację o stanie zadania asynchronicznego. Obiekt AsyncOperation zapewni wywołanie delegata w wątku lub kontekście odpowiednim dla modelu aplikacji. Metoda może opcjonalnie zgłosić zdarzenie, które powiadamia klientów o zmianie stanu, aktualizacji postępu lub nowo dostępnych wynikach przyrostowych.

Parametr arg powinien służyć do przekazywania stanu do delegata d opakowany przez parametr . Może to być odwołanie do obiektu AsyncOperationlub może to być System.ComponentModel.ProgressChangedEventArgs obiekt. Może być pożądane, aby utworzyć własną klasę z System.ComponentModel.ProgressChangedEventArgs , aby zapewnić dodatkowy magazyn stanu.

Uwagi dotyczące dziedziczenia

Dziedzicze muszą asynchronicznie Post(SendOrPostCallback, Object) wywołać, aby dostawcy bibliotek klas nie musieli martwić się potencjalnymi przepełnieniami stosu, jeśli zakładają asynchronię, ale określony model aplikacji ma być synchroniczny.

Uwaga: aplikacje konsolowe nie synchronizują wykonywania Post(SendOrPostCallback, Object) wywołań. Może to spowodować ProgressChanged , że zdarzenia są wywoływane poza kolejnością. Jeśli chcesz serializować wykonywanie wywołań Post(SendOrPostCallback, Object) , zaimplementuj i zainstaluj klasę SynchronizationContext .

Aby uzyskać więcej informacji na temat implementowania klas asynchronicznych, zobacz Implementowanie asynchronicznego wzorca opartego na zdarzeniach.

Dotyczy

Zobacz też