AsyncOperation.Post(SendOrPostCallback, Object) Metod

Definition

Anropar ett ombud i tråden eller kontexten som är lämplig för programmodellen.

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)

Parametrar

d
SendOrPostCallback

Ett SendOrPostCallback objekt som omsluter ombudet som ska anropas när åtgärden avslutas.

arg
Object

Ett argument för ombudet som finns i parametern d .

Undantag

Metoden PostOperationCompleted(SendOrPostCallback, Object) har anropats tidigare för den här uppgiften.

d är null.

Exempel

I följande kodexempel visas hur du använder Post metoden för att rapportera förlopp och inkrementella resultat av en asynkron åtgärd. Det här kodexemplet är en del av ett större exempel för System.ComponentModel.AsyncOperationManager klassen.

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

Kommentarer

Metoden Post anropar ombudet som anges av parametern arg utan att livslängden för den asynkrona åtgärden upphör.

Du kan anropa Post metoden så ofta du vill medan livslängden för den asynkrona åtgärden inte har avslutats av ett anrop till PostOperationCompleted. Du kan använda metoden för att rapportera förlopp eller interimsresultat tillbaka till klienter.

Parametern d omsluter det ombud som du vill anropa när du vill publicera en uppdatering om statusen för den asynkrona aktiviteten. Objektet AsyncOperation ser till att ombudet anropas i tråden eller kontexten som är lämplig för programmodellen. Din metod kan också generera en händelse som meddelar klienter om en statusändring, förloppsuppdatering eller nyligen tillgängliga inkrementella resultat.

Parametern arg ska användas för att skicka tillstånd till ombudet som omsluts av parametern d . Det kan vara en referens till en AsyncOperation, eller ett System.ComponentModel.ProgressChangedEventArgs objekt. Det kan vara önskvärt att härleda din egen klass från System.ComponentModel.ProgressChangedEventArgs för att tillhandahålla ytterligare tillståndslagring.

Anteckningar till arvingar

Arvtagarna måste göra anropet Post(SendOrPostCallback, Object) asynkront, så att klassbiblioteksprovidrar inte behöver bry sig om potentiella stackspill om de antar asynkront men en viss programmodell råkar vara synkron.

Obs! Konsolprogram synkroniserar inte körningen av Post(SendOrPostCallback, Object) anrop. Detta kan leda ProgressChanged till att händelser höjs ur ordning. Om du vill ha serialiserad körning av Post(SendOrPostCallback, Object) anrop implementerar och installerar du en SynchronizationContext klass.

Mer information om hur du implementerar asynkrona klasser finns i Implementera det händelsebaserade asynkrona mönstret.

Gäller för

Se även