Sdílet prostřednictvím


AsyncOperation.Post(SendOrPostCallback, Object) Metoda

Definice

Vyvolá delegáta ve vlákně nebo kontextu vhodném pro model aplikace.

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 po 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 hlášení průběhu a přírůstkových výsledků asynchronní operace. Tento příklad kódu je součástí většího příkladu System.ComponentModel.AsyncOperationManager pro třídu .

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

Poznámky

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

Můžete volat metodu Post 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í požadovaného delegáta, když chcete publikovat aktualizaci stavu asynchronní úlohy. Objekt AsyncOperation zajistí, že je 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á klienty upozorní na 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 AsyncOperationobjekt nebo objekt System.ComponentModel.ProgressChangedEventArgs . Za účelem poskytnutí dalšího úložiště stavu může být žádoucí odvodit vlastní třídu System.ComponentModel.ProgressChangedEventArgs .

Poznámky pro dědice

Dědíci musí učinit Post(SendOrPostCallback, Object) vyvolání asynchronní, aby se zprostředkovatelé 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 je synchronní.

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

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

Platí pro

Viz také