2016-12-03 61 views
0

如果我正在爲我的團隊製作一個圖書館,這個圖書館將在多個項目之間共享,而圖書館正在開展工作,可以成爲async/await的理想人選,我是否還應該包含非異步/等待版本的代碼?它看起來像很多重複的代碼,但我沒有看到任何替代方案。這僅僅是你有能力增加線程池利用率所付出的代價嗎?當我創建異步版本時,是否應始終包含同步版本的方法?

只是要清楚,我不是問我是否應該包含同步包裝方法,這是我所能找到的答案。

例如,我可能有一個長時間運行的SQL查詢。然後我需要用兩種幾乎相同的方法來實現這個接口,一種方法使用SqlConnectionSqlCommand上的async方法,另一種方法不使用它們。這是正確的方法還是我錯過了什麼?

public interface ILongRunningOperation 
{ 
    Response LongRunningOperation(); 

    Task<Response> LongRunningOperationAsync(); 
} 

謝謝!

+0

沒有。不要忘記,你也可以使用LongRunningOperation()的同步形式。達到相同的結果。這是一個晦澀的延伸,並且經常被忽視。 – JamieMeyer

+0

博客文章[我應該公開異步方法的同步包裝?](https://blogs.msdn.microsoft.com/pfxteam/2012/04/13/should-i-expose-synchronous-wrappers-for-asynchronous-方法/)總結:「請儘量不要;如果必要的話,請將其留給您的方法的使用者;您應該考慮有人會同步使用您的功能的可能性,因此相應編碼,儘可能穿線的環境。「 – BACON

+0

相關:[新庫中的異步與非異步方法](http://stackoverflow.com/q/25968037/150605) – BACON

回答

0

我會說在一般情況下答案是「否」。自然異步操作(例如具有I/O的操作)最好通過異步API來表示。

但是,在某些情況下您需要類似的同步API。向後兼容性是一個常見原因。另一個是如果你只是想提供更簡單的同步消費。

如果您決定提供同步API,我建議您查看"boolean argument hack" in my MSDN article on brownfield async。你仍然會得到一個同步和異步的實現,但它只是一種方法,所以你的邏輯不會被重複。