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 而不会结束异步操作的生存期。

在异步操作的生存期尚未通过调用 PostOperationCompleted结束时,可以Post随心所想地调用 方法。 可以使用 方法向客户端报告进度或中间结果。

当您 d 要发布有关异步任务状态的更新时, 参数包装要调用的委托。 对象 AsyncOperation 将确保在适用于应用程序模型的线程或上下文上调用委托。 方法可以选择引发事件,以通知客户端状态更改、进度更新或新提供的增量结果。

arg 使用 参数将状态传递给由 参数包装的 d 委托。 它可能是对 的 AsyncOperation引用,也可能是 System.ComponentModel.ProgressChangedEventArgs 对象。 可能需要从 System.ComponentModel.ProgressChangedEventArgs 派生自己的类来提供额外的状态存储。

继承者说明

继承器必须使调用异步 Post(SendOrPostCallback, Object) ,这样,如果类库提供程序假定异步,但特定应用程序模型恰好是同步的,则类库提供程序就无需担心潜在的堆栈溢出。

注意:控制台应用程序不会同步调用的执行 Post(SendOrPostCallback, Object) 。 这会导致按错误的顺序引发 ProgressChanged 事件。 如果希望序列化 Post(SendOrPostCallback, Object) 调用的执行,请实现并安装 SynchronizationContext 类。

有关实现异步类的详细信息,请参阅 实现基于事件的异步模式

适用于

另请参阅