IAsynchronousいくつかの操作(「開始/終了」パターン)を実行するための2つの方法をサポートするインターフェースがあると仮定します。
IAsyncResult BeginOperation(AsyncCallback callback, object state)EndOperation(IAsyncResult ar)
また、私がクラスA : IAsynchronousとを持っていると仮定しB : IAsynchronousます。Compound : IAsynchronousクラスを実装する必要があります。のCompound操作は、の操作を呼び出しA、その完了を待ってから、Bの操作を呼び出してから、通常どおりコールバックを呼び出すことです。
Compound問題は、クラスをどのように設計するかです。
- 元のオブジェクトを保持し、の操作が完了し
stateたときに元のコールバックを呼び出す必要があります。したがって、単純にまたはCompoundに渡すことはできません。A.BeginOperationB.BeginOperation - また、または
Compound.EndOperationによってスローされた例外を再スローする必要があります。が例外をスローした場合、複合操作はすでに失敗しているため、 's操作は呼び出されません。A.EndOperationB.EndOperationA.EndOperationCompoundB.EndOperation - 内部操作が2つだけでなく、3つ以上ある場合はどうなりますか?一般的な方法はありますか?
明確にするために、次の例を考えてみましょう。Multiplier次のメソッドをサポートするクラスがあると仮定します。
IAsyncResult BeginMultiply(LargeNumber x, LargeNumber y, AsyncCallback callback, object state)LargeNumber EndMultiply(IAsyncResult ar)
そしてThreeMultiplier、次のメソッドをサポートするクラスを作成します。
IAsyncResult BeginMultiply(LargeNumber x, LargeNumber y, LargeNumber z, AsyncCallback callback, object state)LargeNumber EndMultiply(IAsyncResult ar)
クラスは、クラスをThreeMultiplier使用してMultiplierを計算する必要がありますx * y * z。これを行うために、最初にx * y(を介してMultiplier.Begin/EndMultiply)計算し、次に結果に。を掛けzます。もちろん、どのステップでも計算に失敗Multiplier.EndMultiplyするスローを投げることができます。SomeExceptionx * y * z
これを実装するための最良の(または良い)方法は何ですか?パターンはありますか?