2016-12-03 24 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。你仍然会得到一个同步和异步的实现,但它只是一种方法,所以你的逻辑不会被重复。