我有一个存储库,方法Insert
返回一个int
(这里的方法和类型不相关)。我正在考虑为此存储库创建synchronous
和asynchronous
插入方法。对于asynchronous
方法,将synchronous
Insert
方法包含在task
中以避免代码重复是一种很好的做法?为存储库创建异步和同步方法
回答
不,这不是一个好的做法,如微软的Stephen Toub这里详细:
...和斯蒂芬·克利里在这里:
http://blog.stephencleary.com/2013/11/taskrun-etiquette-examples-dont-use.html
长的故事总之,如果你的方法确实是在Task.Run
中打包同步调用,那很简单,我确定调用者完全有能力自己做。没有必要增加API的表面积,除非你有一个自然的异步操作(或者除非你知道将来你可以提供一个,并且因此希望消费者从第一天开始以XxxAsync
为目标方法)。
作为奖励,这里是从一个流行的库中取出的异步包装方法现实生活中的例子:用于提供SerializeAsync
和DeserializeAsync
方法使用Task.Factory.StartNew
这只是围绕他们的同步同行包装
JSON.NET。这些最终被废弃,因为它们不会增加API的价值,并被认为是潜在的可扩展性问题。充分讨论而导致这一变化可以在这里找到:
这里是一个场景:我在web api中实现了这个仓库,api方法是异步的,从你提供的链接中,我已经明白它不是正确的在Task.Run中包装一些代码,那么在这种情况下如何继续?假设代码是一个原子指令... –
@BudaGavril,你必须*提供一个'Task'返回方法的场景由于设计限制,有两种选择取决于磨损她的消费者可以容忍阻断电话。在web API中,由于传输已经具有异步性,因此它们可以。因此,如果你的方法不包含任何其他的异步操作(但必须返回一个'Task'),你只需像往常一样进行工作,并在最后返回'Task.FromResult(...)'。在阻塞会真正给消费者造成问题的情况下,一定要使用'Task.Run'。 –
P.S.这实际上是一个比所问的更有趣的问题。考虑将它作为单独的问题发布,并附上代码示例。我在上面的评论中几乎没有触及表面。 –
- 1. 异步和同步方法
- 2. DDD和异步存储库
- 3. 同步异步方法
- 4. 以异步方式异步创建BitmapFrame
- 5. 异步方法调用同步方法
- 6. 同步远程存储库
- 7. Trac存储库同步
- 8. 先后调用异步方法和同步方法
- 9. WCF服务方法同步/异步
- 10. 同步异步调用的方法?
- 11. 如何同步异步方法?
- 12. 异步方法的同步版本
- 13. 异步调用同步webservice方法
- 14. 异步方法中的异步方法
- 15. 同步Subversion和Harvest SCM存储库?
- 16. 使用CodeMemberMethod创建异步方法
- 17. 创建异步包装器的方法
- 18. 试图创建一个异步方法
- 19. PRISM:创建异步方法的管道
- 20. 如何从非异步方法异步调用异步方法
- 21. 切换同步和异步行为
- 22. 同步和异步回调
- 23. 同步和异步活动
- 24. 包含异步调用和同步操作对结果的异步方法
- 25. Android异步HTTP库:如何从onSuccess方法存储值?
- 26. Firebase保存数据方法异步或同步
- 27. 异步方法
- 28. 异步方法
- 29. RedisSessionProvider和异步方法
- 30. 异步存储库Silverlight应用程序
你应该写从地上爬起来的异步方法,使用可用的方法异步版本(例如,如果使用实体框架 - 你必须使用FirstAsync(),SaveChangesAsync等。 – Evk