首页 > 解决方案 > Fire and Forget 没有安排好

问题描述

Task.Run(() => this.someMethod())用来安排后台工作。我对操作结果不感兴趣,需要继续申请流程。

但是,有时我的后台任务很长一段时间都没有安排好。自从我们从 .Net 4.7 从 4.5 迁移后,这种情况就开始发生了。即使在调试断点时也没有命中或在相当长的延迟(> 10 分钟)后命中。

有没有人注意到这种行为或知道是什么原因造成的?

我在 i7 内核、16 GB RAM 上运行。

标签: c#.netmultithreadingtasktask-parallel-library

解决方案


让你的任务需要 10 分钟才能开始听起来很可疑。我的猜测是你的系统负载很重,或者你有很多任务正在运行。

我将攻击后者(针对特定情况)。

任务创建选项

LongRunning指定一个任务将是一个长时间运行的粗粒度操作,涉及比细粒度系统更少、更大的组件。它向 TaskScheduler 提供了一个提示,表明可能需要超额订阅。超额订阅允许您创建比可用硬件线程数更多的线程。它还向任务调度程序提供了一个提示,即该任务可能需要一个额外的线程,这样它就不会阻塞本地线程池队列上的其他线程或工作项的前进进程。

var task = new Task(() => MyLongRunningMethod(),TaskCreationOptions.LongRunning);
task.Start();

这是Stephen Toub在这篇文章中引用的 MSFT

在幕后,这将导致使用更多的线程,因为它的目的是允许 ThreadPool 继续处理工作项,即使一个任务运行了很长时间;如果该任务在池中的线​​程中运行,则该线程将无法为其他任务提供服务。如果您通过性能测试发现不使用它会导致其他工作的处理出现长时间延迟,您通常只会使用 LongRunning。

如果不查看所有代码,很难知道您的问题是什么,但是我将其发布为建议。


推荐阅读