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.
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
備註
此 Post 方法在不終止非同步操作壽命的情況下,會呼叫參數指定的 arg 代理。
你可以無限次呼叫該 Post 方法,只要非同步操作的壽命尚未因呼叫 而 PostOperationCompleted終止。 你可以用這個方法向客戶回報進度或中期結果。
d參數會包裝你想呼叫的代理,當你想發布非同步任務狀態更新時。 物件 AsyncOperation 會確保你的代理在適合應用模型的執行緒或上下文中被呼叫。 你的方法可選擇性地提出事件,通知客戶端狀態變更、進度更新或新增的增量結果。
arg參數應該用來將狀態傳遞給被d參數包裹的代理。 它可能是指某個 AsyncOperation,也可能是某個 System.ComponentModel.ProgressChangedEventArgs 物件。 有時會想從中衍生出自己的類別 System.ComponentModel.ProgressChangedEventArgs ,以提供額外的狀態儲存空間。
給繼承者的注意事項
繼承者必須讓 Post(SendOrPostCallback, Object) 調用成為非同步,這樣類別函式庫提供者若假設非同步但特定應用模型是同步的,就不必擔心堆疊溢位的問題。
注意:主控台應用程式不會同步呼叫的 Post(SendOrPostCallback, Object) 執行。 這可能會導致 ProgressChanged 事件錯誤順序地引發。 如果您希望執行 Post(SendOrPostCallback, Object) 呼叫時採用串行方式,請實作並安裝 SynchronizationContext 類別。
欲了解更多關於實作非同步類別的資訊,請參閱 「實作基於事件的非同步模式」。