IAsynchronous
いくつかの操作(「開始/終了」パターン)を実行するための2つの方法をサポートするインターフェースがあると仮定します。
IAsyncResult BeginOperation(AsyncCallback callback, object state)
EndOperation(IAsyncResult ar)
また、私がクラスA : IAsynchronous
とを持っていると仮定しB : IAsynchronous
ます。Compound : IAsynchronous
クラスを実装する必要があります。のCompound
操作は、の操作を呼び出しA
、その完了を待ってから、B
の操作を呼び出してから、通常どおりコールバックを呼び出すことです。
Compound
問題は、クラスをどのように設計するかです。
- 元のオブジェクトを保持し、の操作が完了し
state
たときに元のコールバックを呼び出す必要があります。したがって、単純にまたはCompound
に渡すことはできません。A.BeginOperation
B.BeginOperation
- また、または
Compound.EndOperation
によってスローされた例外を再スローする必要があります。が例外をスローした場合、複合操作はすでに失敗しているため、 's操作は呼び出されません。A.EndOperation
B.EndOperation
A.EndOperation
Compound
B.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
するスローを投げることができます。SomeException
x * y * z
これを実装するための最良の(または良い)方法は何ですか?パターンはありますか?