Task.Run作为反模式?

时间:2015-02-27 13:15:20

标签: .net task-parallel-library async-await

我正在使用SQLite.NET PCL库来实现我的WinRT项目 SQliteAsyncConnection类,它提供经典SQLiteConnection方法的异步版本。但是,在项目Github page上,陈述如下:

  

请注意使用的Task.Run模式   SQLiteAsyncConnection可以被视为反模式(库   不应该提供异步方法,除非它们是真正的异步)。这个   维护类是为了向后兼容性和用例   其中异步隔离很方便

为什么在这种情况下使用Task.Run被视为反模式?这允许开发人员实现他所需的目标 - 在应用程序保持响应用户输入的同时在单独的线程上运行数据库访问代码。每次手动编写Task.Run代码段并不完全使用该类的异步版本会更好吗?

这种模式的潜在问题和挫折是什么?

1 个答案:

答案 0 :(得分:5)

是。如果库的使用者明确声明他想要将该工作卸载到另一个线程(如果它不止一次出现,他们可以像库一样有一个辅助方法),那会更好。

否则他们可能会认为此方法本质上是异步的。事实并非如此,除非您能查看源代码,否则您无法知道。

可以在Should I expose asynchronous wrappers for synchronous methods?中找到更长的解释。具体来说:

  

我认为应该公开的唯一异步方法是那些比同步方案具有可扩展性优势的方法。异步方法不应仅仅出于卸载的目的而暴露:使用专门用于异步处理同步方法的功能的同步方法的消费者可以很容易地实现这样的好处,例如, Task.Run。