我相信您永远不必在.net核心Web上下文中使用Task.Run进行任何操作。如果您有长时间运行的任务或占用大量CPU的任务,则可以将其卸载到消息队列中以进行异步处理。如果您有一个同步操作,但没有等效的异步方法,那么卸载到后台线程对您没有任何帮助,实际上会使情况变得更糟。
我想念什么?在高吞吐量服务器应用程序中使用Task.Run是否有真正的理由?
答案 0 :(得分:2)
一些简单的例子:
一个日志记录系统,其中每个工作线程都可以写入队列,而工作线程负责将项目出队并将其写入日志文件。
要使用昂贵的初始化访问公寓式COM服务器,最好在其自己的线程上保留单个实例。
用于在计时器上运行的逻辑,例如每10分钟运行一次事务,以更新具有某种状态的应用程序变量。
与CPU绑定的操作,其中单个响应时间比服务器吞吐量更重要。
在HTTP响应完成后必须继续运行的逻辑,例如如果总处理时间超过HTTP响应超时。
用于系统操作的工作线程,例如一个长期运行的线程,用于检查过期的缓存条目。
答案 1 :(得分:0)
只需备份您的信念:
请勿:调用Task.Run,立即等待。 ASP.NET Core已在普通线程池线程上运行应用程序代码,因此调用 Task.Run仅会导致不必要的额外线程池调度。 即使计划的代码将阻塞线程,Task.Run也不 防止这种情况。
这是官方的recommendation/best practice from Microsoft。尽管它没有指出您可能会错过的东西,但它确实告诉您这是个坏主意以及原因。