2016-11-18 74 views
0

我有一个存储库,方法Insert返回一个int(这里的方法和类型不相关)。我正在考虑为此存储库创建synchronousasynchronous插入方法。对于asynchronous方法,将synchronousInsert方法包含在task中以避免代码重复是一种很好的做法?为存储库创建异步和同步方法

+0

你应该写从地上爬起来的异步方法,使用可用的方法异步版本(例如,如果使用实体框架 - 你必须使用FirstAsync(),SaveChangesAsync等。 – Evk

回答

4

不,这不是一个好的做法,如微软的Stephen Toub这里详细:

https://blogs.msdn.microsoft.com/pfxteam/2012/03/24/should-i-expose-asynchronous-wrappers-for-synchronous-methods/

...和斯蒂芬·克利里在这里:

http://blog.stephencleary.com/2013/11/taskrun-etiquette-examples-dont-use.html

长的故事总之,如果你的方法确实是在Task.Run中打包同步调用,那很简单,我确定调用者完全有能力自己做。没有必要增加API的表面积,除非你有一个自然的异步操作(或者除非你知道将来你可以提供一个,并且因此希望消费者从第一天开始以XxxAsync为目标方法)。

作为奖励,这里是从一个流行的库中取出的异步包装方法现实生活中的例子:用于提供SerializeAsyncDeserializeAsync方法使用Task.Factory.StartNew这只是围绕他们的同步同行包装

JSON.NET。这些最终被废弃,因为它们不会增加API的价值,并被认为是潜在的可扩展性问题。充分讨论而导致这一变化可以在这里找到:

https://github.com/JamesNK/Newtonsoft.Json/issues/66

+0

这里是一个场景:我在web api中实现了这个仓库,api方法是异步的,从你提供的链接中,我已经明白它不是正确的在Task.Run中包装一些代码,那么在这种情况下如何继续?假设代码是一个原子指令... –

+0

@BudaGavril,你必须*提供一个'Task'返回方法的场景由于设计限制,有两种选择取决于磨损她的消费者可以容忍阻断电话。在web API中,由于传输已经具有异步性,因此它们可以。因此,如果你的方法不包含任何其他的异步操作(但必须返回一个'Task'),你只需像往常一样进行工作,并在最后返回'Task.FromResult(...)'。在阻塞会真正给消费者造成问题的情况下,一定要使用'Task.Run'。 –

+0

P.S.这实际上是一个比所问的更有趣的问题。考虑将它作为单独的问题发布,并附上代码示例。我在上面的评论中几乎没有触及表面。 –