2015-04-30 42 views
0

我正在實現具有一些執行異步I/O的APM方法的庫。 (爲了解決這個問題,我不能使用任務,異步/等待,Rx,第三方庫等)在另一個APM操作中包裝APM操作

說我的APM庫方法之一BeginOuter()只是推遲到另一個APM方法, BeginInner(),做它的異步I/O。如果我對用戶輸入所做的其他操作都是同步的,是否有任何原因導致我無法重複使用BeginInner()的內部IAsyncResult作爲外部IAsyncResultBeginOuter()?如:

// 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是城市中唯一的遊戲。

回答

1

在單個操作上捎帶一點同步代碼就行了。

如果你添加的代碼沒有被阻塞,調用者可能不會期望的可能是最好的。

未將state參數傳遞給內部操作有點頑皮 - 您可能應該從Begin...方法簽名中省略它,或者如果可以的話將其傳遞。

+0

糟糕,我確實忘記了在我的僞代碼中傳遞狀態參數。修正了,謝謝。當你說「如果我添加的代碼不會阻塞」 - 你是指這裏只有一個長時間運行的阻塞操作?假設MakeOutputStuff()運行速度非常快,並且沒有執行任何額外的I/O等。 – user1454265

+0

是的我只是想避免應該是異步的東西。 –