したがって、この質問は、.Net IAsyncResultデザインパターンと、この質問EndInvoke
でカバーされている呼び出しの必要性に関するものです。
バックグラウンド
特定の関数への潜在的に多くの非同期呼び出しを開始し、これらすべての呼び出しが終了するのを待ってEndInvoke()
から、すべての結果を取得するために使用するコードがあります。
質問1
呼び出すまで、いずれかの呼び出しで例外が発生したかどうかはわかりません。いずれかの呼び出しEndInvoke()
で例外が発生した場合、メソッド全体が失敗し、例外がAPI固有の例外にラップされて、上位にスローされます。
だから私の最初の質問は、残りの非同期呼び出しが適切に終了することを保証するための最良の方法は何ですか?
終了していない残りの呼び出しを呼び出す(そしてそれ以上の例外を無視する)finally
ブロックは、これを行うための最良の方法ですか?EndInvoke()
質問2
次に、最初にすべてのasyc呼び出しを開始するときに、インスタンスから取得したインスタンスWaitHandle.WaitAll()
の配列を呼び出します。これらすべての非同期呼び出しを起動しているメソッドには、順守するタイムアウトがあるため、これをメソッドに提供します。次に、すべての呼び出しが完了したかどうかをテストします。完了していない場合は、タイムアウトに達している必要があります。これにより、メソッドも失敗し、別のAPI固有の例外がスローされます。WaitHandle
IAsyncResult
WaitAll()
だから私の2番目の質問はこの場合私は何をすべきかということです。
エラーをスローする前に、これらすべての非同期呼び出しを終了するために呼び出す必要がありEndInvoke()
ますが、同時に、EndInvoke()
がブロックされているため、コードがスタックしないようにします。理論的には、少なくともWaitAll()
呼び出しがタイムアウトした場合、すべての非同期呼び出しはタイムアウトによって制御されているため、すべての非同期呼び出し自体がタイムアウトになり、例外がスローされます(したがって呼び出しが完了します)が、このタイムアウトはメインのタイムアウトとは異なる可能性があります