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
パラメーターに格納されているデリゲートの引数。
例外
PostOperationCompleted(SendOrPostCallback, Object) メソッドは、このタスクに対して既に呼び出されています。
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
パラメーターで指定されたデリゲートを呼び出します。
非同期操作の有効期間が の Post 呼び出しによって終了していない間は、必要な頻度で メソッドを呼び出 PostOperationCompletedすことができます。 メソッドを使用して、進行状況または中間結果をクライアントに報告できます。
パラメーターは d
、非同期タスクの状態に関する更新を投稿するときに呼び出すデリゲートをラップします。 オブジェクトは AsyncOperation 、アプリケーション モデルに適したスレッドまたはコンテキストでデリゲートが確実に呼び出されるようにします。 メソッドは、必要に応じて、状態の変更、進行状況の更新、または新しく利用可能な増分結果をクライアントに通知するイベントを発生させることができます。
パラメーターで arg
ラップされたデリゲートに状態を渡すには、 パラメーターを使用する d
必要があります。 への参照 AsyncOperationであるか、 オブジェクトである System.ComponentModel.ProgressChangedEventArgs 可能性があります。 追加の状態ストレージを提供するために、 から System.ComponentModel.ProgressChangedEventArgs 独自のクラスを派生することが望ましい場合があります。
注意 (継承者)
継承者は呼び出しを Post(SendOrPostCallback, Object) 非同期にして、クラス ライブラリ プロバイダーが非同期であると想定しているが、特定のアプリケーション モデルが同期的である場合にスタック オーバーフローの可能性に関心を持つ必要がないようにする必要があります。
注: コンソール アプリケーションは、呼び出しの Post(SendOrPostCallback, Object) 実行を同期しません。 これが原因で、ProgressChanged
イベントが正しくない順序で発生することがあります。 Post(SendOrPostCallback, Object) 呼び出しを順次実行するには、SynchronizationContext クラスを実装およびインストールします。
非同期クラスの実装の詳細については、「 イベント ベースの非同期パターンの実装」を参照してください。
適用対象
こちらもご覧ください
.NET