我应该何时在Asp.Net Core中使用Task.Run?

时间:2018-07-10 02:38:55

标签: c# asp.net-core

我相信您永远不必在.net核心Web上下文中使用Task.Run进行任何操作。如果您有长时间运行的任务或占用大量CPU的任务,则可以将其卸载到消息队列中以进行异步处理。如果您有一个同步操作,但没有等效的异步方法,那么卸载到后台线程对您没有任何帮助,实际上会使情况变得更糟。

我想念什么?在高吞吐量服务器应用程序中使用Task.Run是否有真正的理由?

2 个答案:

答案 0 :(得分:2)

一些简单的例子:

  1. 一个日志记录系统,其中每个工作线程都可以写入队列,而工作线程负责将项目出队并将其写入日志文件。

  2. 要使用昂贵的初始化访问公寓式COM服务器,最好在其自己的线程上保留单个实例。

  3. 用于在计时器上运行的逻辑,例如每10分钟运行一次事务,以更新具有某种状态的应用程序变量。

  4. 与CPU绑定的操作,其中单个响应时间比服务器吞吐量更重要。

  5. 在HTTP响应完成后必须继续运行的逻辑,例如如果总处理时间超过HTTP响应超时。

  6. 用于系统操作的工作线程,例如一个长期运行的线程,用于检查过期的缓存条目。

答案 1 :(得分:0)

只需备份您的信念:

请勿:调用Task.Run,​​立即等待。 ASP.NET Core已在普通线程池线程上运行应用程序代码,因此调用 Task.Run仅会导致不必要的额外线程池调度。 即使计划的代码将阻塞线程,Task.Run也不 防止这种情况。

这是官方的recommendation/best practice from Microsoft。尽管它没有指出您可能会错过的东西,但它确实告诉您这是个坏主意以及原因。