假設,我有IAsynchronous
接口支持用於做一些操作的兩種方法( 「開始/結束」 模式):複合異步調用 - 如何?
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
應重新拋出由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
。
什麼是最好(或好)的方式來實現這個?有什麼模式嗎?
這是否與Visual Studio 2010? –
@PeterRitchie最好.NET 3.5 – eigenein