AsyncOperation.Post(SendOrPostCallback, Object) Metoda

Definice

Vyvolá delegáta ve vlákně nebo kontextu vhodném pro aplikační model.

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

Objekt SendOrPostCallback , který zabalí delegáta, který má být volána při ukončení operace.

arg
Object

Argument delegáta obsaženého v parametru d .

Výjimky

Příklady

Následující příklad kódu ukazuje použití Post metody pro generování sestav průběhu a přírůstkové výsledky asynchronní operace. Tento příklad kódu je součástí většího příkladu uvedeného pro třídu 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

Poznámky

Metoda Post vyvolá delegáta určeného arg parametrem bez ukončení životnosti asynchronní operace.

Metodu Post můžete volat tak často, jak chcete, zatímco životnost asynchronní operace nebyla ukončena voláním PostOperationCompleted. Metodu můžete použít k hlášení průběhu nebo průběžných výsledků zpět klientům.

Parametr d zabalí delegáta, kterého chcete volat, když chcete publikovat aktualizaci o stavu asynchronní úlohy. Objekt AsyncOperation zajistí, aby byl váš delegát vyvolán ve vlákně nebo kontextu vhodném pro aplikační model. Vaše metoda může volitelně vyvolat událost, která klientům oznámí změnu stavu, aktualizaci průběhu nebo nově dostupné přírůstkové výsledky.

Parametr arg by měl být použit k předání stavu delegátovi zabaleného parametrem d . Může se jednat o odkaz na objekt AsyncOperationnebo System.ComponentModel.ProgressChangedEventArgs objekt. K zajištění dalšího úložiště stavu může být žádoucí odvodit vlastní třídu System.ComponentModel.ProgressChangedEventArgs .

Poznámky pro dědice

Dědiče musí být Post(SendOrPostCallback, Object) vyvolání asynchronní, aby se poskytovatelé knihovny tříd nemuseli zabývat potenciálními přetečeními zásobníku, pokud předpokládají asynchrony, ale konkrétní aplikační model bude synchronní.

Poznámka: Konzolové aplikace nesynchronizují provádění Post(SendOrPostCallback, Object) volání. To může způsobit ProgressChanged vyvolání událostí mimo pořadí. Pokud chcete mít serializované provádění Post(SendOrPostCallback, Object) volání, implementujte a nainstalujte SynchronizationContext třídu.

Další informace o implementaci asynchronních tříd naleznete v tématu Implementace asynchronního vzoru založeného na událostech.

Platí pro

Viz také