我正在實現具有一些執行異步I/O的APM方法的庫。 (爲了解決這個問題,我不能使用任務,異步/等待,Rx,第三方庫等)在另一個APM操作中包裝APM操作
說我的APM庫方法之一BeginOuter()
只是推遲到另一個APM方法, BeginInner()
,做它的異步I/O。如果我對用戶輸入所做的其他操作都是同步的,是否有任何原因導致我無法重複使用BeginInner()
的內部IAsyncResult
作爲外部IAsyncResult
的BeginOuter()
?如:
// Omitting non-APM parameters for clarity; assume these methods do synchronous work on some other input.
public IAsyncResult BeginOuter(InputStuff stuff, AsyncCallback callback, object state)
{
return BeginInner(stuff, result =>
{
callback(result);
}, state);
}
public OutputStuff EndOuter(IAsyncResult result)
{
EndInner(result);
// Do some synchronous work to get OutputStuff.
return MakeOutputStuff();
}
顯然,如果BeginOuter()
被多個異步調用鏈接在一起來完成工作,這將會是一個錯誤手主叫回的只有第一個等待。但是如果只有一個異步調用呢?
此外,於我而言,沒有什麼我能想到的是,來電者可以搞砸後BeginInner()
完成,但他們打電話前 - 他們將要取決於結果做任何有用的東西。
只是很難整合所有這方面的信息。我已經看到了IAsyncResult模式的幾個實現,但除了:http://mtaulty.com/communityserver/blogs/mike_taultys_blog/archive/2005/02/21/5279.aspx之外,我無法找到關於這個特定用例的很多內容。想要更好地理解這些細微之處。
編輯:我沒有看到this question,但我查了時間的響應都是「用[庫]」,「做不同」,或「實施的IAsyncResult」(但沒有進入的原因)。我試圖理解這是否是一個可以接受的事情,或者如果實現IAsyncResult是城市中唯一的遊戲。
糟糕,我確實忘記了在我的僞代碼中傳遞狀態參數。修正了,謝謝。當你說「如果我添加的代碼不會阻塞」 - 你是指這裏只有一個長時間運行的阻塞操作?假設MakeOutputStuff()運行速度非常快,並且沒有執行任何額外的I/O等。 – user1454265
是的我只是想避免應該是異步的東西。 –