二つの質問を確保EndInvoke()が呼び出されるリストのIAsyncResult物
-
27-09-2019 - |
質問
この問題に関する。純IAsyncResultデザインパターンとの必要性を呼び出し EndInvoke
とした この 質問
背景
しているのか教えてくださいコードを私が焼き切る多くの非同期通話、特定の機能を待ってこれらすべての通話を終了を使用する前に EndInvoke()
を取り戻すべての結果を
質問1
かどうかはわかりませんの話を検出した例外で呼びかけ EndInvoke()
ベ例外が発生したのは全体のメソッドは失敗する例外がに包まれ、APIの特定の例外をスローされ上がります。
私の最初の質問は、何が最良の方法その他の非同期通話の取得を適切に切断されますか。
は finally
ブロックを呼びかけ EndInvoke()
の残りの素線が呼び出しは無視さを除く)のうるのか?
質問2
第二に初めて火を切っasyc電話として通話 WaitHandle.WaitAll()
の配列 WaitHandle
インスタンスがしっか IAsyncResult
う場合がございます。の方法で焼成すべてのこれらの非同期通話にはタイムアウトに従い提供するの WaitAll()
方法。しているかどうかを試験すべての通話を完了しない場合にはそのタイムアウトが必要に達していく方法にもなるような別のAPIの特定の例外です。
その後、私の第二の質問はどうしたらよいかるでしょうか?
私は電話をする必要があり EndInvoke()
解除はこれらすべての非同期通話しによると、エラーが同時に私たいと思っているコードによって EndInvoke()
は遮断する理論的には以上の場合 WaitAll()
電話回はそのうちにすべての非同期通話は自分とは正の例外がスローされ(このように電話)からもよりタイムアウトがこのタイムアウトが潜在的に異なるからタイムアウト
解決
私が繰り返し処理を実行して IAsyncResult
ブラッピング各 EndInvoke
try/catchを格納する為発生する例外。そして、きっとすべての EndInvoke
sんだ格納されず、例外的に投APIる場合の例外です。のようなもの:
var exs = new List<Exception>();
foreach (IAsyncResult iasr in asyncResults) {
try {
iasr.EndInvoke();
}
catch (Exception e) {
exs.Add(e);
}
}
if (exs.Count > 0) {
throw new MyException(exs.ToReadOnly());
}
他のヒント
私の使用をお勧めしの代わりに作業をすIAsyncResultします。いすぐに"継続"セマンティクス、ラップ、IAsyncResult API呼び出しEndInvoke適です。