2011-01-07 13 views
0

私は代理人を使用していくつかの非同期関数呼び出しを設定するC#アプリケーションを開発中です。これらの呼び出しは複数呼び出しの対象になるため、userState引数を取るデリゲートのBeginInvokeメソッドのオーバーロードを使用する必要があります。例えば:Event-based Asynchronous Pattern Overview page on MSDN複数の非同期呼び出しを行うREQUIRE unique userStates?

callerDelegate.BeginInvoke([fn_args...], callback, userState) 

、それはuserStateについて述べている: シングル呼び出しと 複数の呼び出し:

は、潜在的に2つのオーバーロード、非同期操作のための があります。 は、 メソッドシグネチャでこれらの2つのフォームを区別できます。 複数呼び出しフォームには、userStateという追加の パラメータがあります。このフォーム は、 のコードで、 の操作が完了するのを待つことなく、Method1Async(文字列パラメータ、オブジェクト 、userState)を複数回呼び出すことができます。 別の の手で メソッド1Async(文字列パラメータ)を呼び出すと、 前の呼び出しが完了する前に、 メソッドが のInvalidOperationExceptionを発生させます。

複数呼び出しのオーバーロードのuserStateパラメーターを使用すると、 の操作で非同期の操作を区別することができます。 あなたは 各操作が完了すると、あなたの イベントハンドラはの インスタンスを決定することができ Method1Async(文字列 PARAM、オブジェクトuserState)、およびへの呼び出しごとに一意の値 (例えば、GUIDやハッシュコード)を提供しますオペレーションが完了イベントの を発生させました。

私の質問は:userStateは一意である必要がありますか?言葉はそれを単なる推薦にするか、または単にその例に関連するものと解釈することができます。私はコールバックに状態を渡す必要があります、私はそれが一意である必要はありません。 (私のアプリケーションでは、呼び出しの個々のインスタンスを追跡する必要はありません)。したがって、一意性は要件ですか? (おそらく、.NETの非同期フレームワークは、それを必要ですか?)

また、引用されたページはイベントベースの非同期操作のためです。これは私のケース(代理人を使った非同期呼び出し)にも当てはまりますか?

私は数日間GoogleとSOを検索し、まだ答えを見つける必要がありません。

ありがとうございます。

答えて

3

あなたのケースには該当しません。 Begin/Endは、イベントベースの非同期パターン(EAP)ではなく、IAsyncResult非同期パターンです。

通常、インプリメンテーションに固有のユーザ状態が必要なAsyncOperationManager.CreateOperationが使用されるため、EAPに影響します。この場合でも、エンドユーザコードがnullユーザ状態を渡すことは(通常)有効です。 CreateOperationを呼び出すと、EAPコンポーネントはそれをnew objectに置き換えます。

+0

多くのありがとうございます! (そのような冗長な質問に対するそのような簡潔な応答!) – paul

関連する問題