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.
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类。

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

适用于

另请参阅