AsyncOperation.Post(SendOrPostCallback, Object) 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
在適合應用程式模型的執行緒或內容上叫用委派。
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)
參數
SendOrPostCallback 物件,包裝作業結束時要呼叫的委派。
- arg
- Object
包含在 d
參數中的委派引數。
例外狀況
d
為 null
。
範例
下列程式代碼範例示範如何使用 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 類別。
如需實作異步類別的詳細資訊,請參閱 實作事件架構異步模式。