Share via


AsyncOperation.Post(SendOrPostCallback, Object) 方法

定義

在適合應用程式模型的執行緒或內容上叫用委派。

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)

參數

d
SendOrPostCallback

SendOrPostCallback 物件,包裝作業結束時要呼叫的委派。

arg
Object

包含在 d 參數中的委派引數。

例外狀況

dnull

範例

下列程式代碼範例示範如何使用 Post 方法來報告異步操作的進度和累加結果。 此程式代碼範例是針對 類別提供的較大範例的 System.ComponentModel.AsyncOperationManager 一部分。

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

備註

方法 Post 會叫用 參數指定的 arg 委派,而不會結束異步操作的存留期。

您可以在異步操作的存留期尚未結束時,盡可能常呼叫 PostPostOperationCompleted方法。 您可以使用 方法來將進度或過渡結果回報給用戶端。

當您想要張貼異步工作狀態的更新時,參數會 d 包裝您想要呼叫的委派。 對象 AsyncOperation 可確保您的委派是在適用於應用程式模型的線程或內容上叫用。 您的方法可以選擇性地引發事件,以通知客戶端狀態變更、進度更新或新可用的累加結果。

參數 arg 應該用來將狀態傳遞至參數所包裝的 d 委派。 它可能是的 AsyncOperation參考,或者可能是 System.ComponentModel.ProgressChangedEventArgs 物件。 建議您從 System.ComponentModel.ProgressChangedEventArgs 衍生您自己的類別,以提供額外的狀態記憶體。

給繼承者的注意事項

繼承者必須讓 Post(SendOrPostCallback, Object) 叫用異步,如此一來,如果類別庫提供者假設異步,但特定應用程式模型發生同步,就不需要擔心潛在的堆疊溢位。

注意:主控台應用程式不會同步執行 Post(SendOrPostCallback, Object) 呼叫。 這可能會造成 ProgressChanged 事件不按順序引發。 如果您想要以序列化方式執行 Post(SendOrPostCallback, Object) 呼叫,請實作及安裝 SynchronizationContext 類別。

如需實作異步類別的詳細資訊,請參閱 實作事件架構異步模式

適用於

另請參閱