次の方法で共有


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 パラメーターに含まれるデリゲートの引数。

例外

このタスクでは、 PostOperationCompleted(SendOrPostCallback, Object) メソッドが以前に呼び出されています。

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 パラメーターで指定されたデリゲートを呼び出します。

非同期操作の有効期間がPostOperationCompletedの呼び出しによって終了されていない間は、Post メソッドを何度でも呼び出すことができます。 このメソッドを使用して、進行状況または中間結果をクライアントに報告できます。

d パラメーターは、非同期タスクの状態に関する更新を投稿するときに呼び出すデリゲートをラップします。 AsyncOperation オブジェクトは、アプリケーション モデルに適したスレッドまたはコンテキストでデリゲートが確実に呼び出されるようにします。 メソッドは、必要に応じて、状態の変更、進行状況の更新、または新しく利用可能な増分結果をクライアントに通知するイベントを発生させることができます。

arg パラメーターを使用して、d パラメーターでラップされたデリゲートに状態を渡す必要があります。 AsyncOperationへの参照であるか、System.ComponentModel.ProgressChangedEventArgs オブジェクトである可能性があります。 System.ComponentModel.ProgressChangedEventArgsから独自のクラスを派生して、追加の状態ストレージを提供することが望ましい場合があります。

注意 (継承者)

継承子は Post(SendOrPostCallback, Object) 呼び出しを非同期にする必要があります。そのため、クラス ライブラリ プロバイダーが非同期性を想定しているが、特定のアプリケーション モデルが同期的である場合に、スタック オーバーフローの可能性に気を付ける必要はありません。

注: コンソール アプリケーションは、 Post(SendOrPostCallback, Object) 呼び出しの実行を同期しません。 これにより、ProgressChanged イベントが順番通りに発生しない可能性があります。 Post(SendOrPostCallback, Object)呼び出しの実行をシリアル化する場合は、SynchronizationContext クラスを実装してインストールします。

非同期クラスの実装の詳細については、「 イベント ベースの非同期パターンの実装」を参照してください。

適用対象

こちらもご覧ください