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.

Parametr d ma wartość null.

Przykłady

W poniższym przykładzie kodu pokazano użycie Post metody raportowania postępu i przyrostowych wyników operacji asynchronicznej. Ten przykład kodu jest częścią większego przykładu udostępnionego dla klasy System.ComponentModel.AsyncOperationManager.

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

Uwagi

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

Metodę Post można wywołać 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 do raportowania postępu lub wyników tymczasowych z powrotem do klientów.

Parametr d opakowuje delegata, który chcesz wywołać, gdy chcesz opublikować aktualizację o stanie zadania asynchronicznego. Obiekt AsyncOperation zapewni, że delegat jest wywoływany 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 uzyskać własną klasę, System.ComponentModel.ProgressChangedEventArgs aby zapewnić dodatkowy magazyn stanu.

Notatki dotyczące dziedziczenia

Dziedziczenie musi asynchroniczne Post(SendOrPostCallback, Object) wywołania, aby dostawcy bibliotek klas nie musieli się martwić potencjalnymi przepełnieniami stosu, jeśli zakładają asynchronię, ale określony model aplikacji jest synchroniczny.

Uwaga: aplikacje konsolowe nie synchronizują wykonywania wywołań Post(SendOrPostCallback, Object) . Może to spowodować, że ProgressChanged zdarzenia są wywoływane poza kolejnością. Aby mieć sekwencyjne 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ż