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
而不会结束异步操作的生存期。
在异步操作的生存期尚未通过调用 PostOperationCompleted结束时,可以Post随心所想地调用 方法。 可以使用 方法向客户端报告进度或中间结果。
当您 d
要发布有关异步任务状态的更新时, 参数包装要调用的委托。 对象 AsyncOperation 将确保在适用于应用程序模型的线程或上下文上调用委托。 方法可以选择引发事件,以通知客户端状态更改、进度更新或新提供的增量结果。
应 arg
使用 参数将状态传递给由 参数包装的 d
委托。 它可能是对 的 AsyncOperation引用,也可能是 System.ComponentModel.ProgressChangedEventArgs 对象。 可能需要从 System.ComponentModel.ProgressChangedEventArgs 派生自己的类来提供额外的状态存储。
继承者说明
继承器必须使调用异步 Post(SendOrPostCallback, Object) ,这样,如果类库提供程序假定异步,但特定应用程序模型恰好是同步的,则类库提供程序就无需担心潜在的堆栈溢出。
注意:控制台应用程序不会同步调用的执行 Post(SendOrPostCallback, Object) 。 这会导致按错误的顺序引发 ProgressChanged
事件。 如果希望序列化 Post(SendOrPostCallback, Object) 调用的执行,请实现并安装 SynchronizationContext 类。
有关实现异步类的详细信息,请参阅 实现基于事件的异步模式。