【问题标题】:Fire and Forget not getting scheduledFire and Forget 没有安排好
【发布时间】:2018-05-24 03:10:03
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你有很多其他任务在后台运行吗?
  • 这里还有一些输入:- 系统没有任何负载。这种即发即弃的操作有时会起作用,但并非总是如此。任务中的工作不是长期运行的。它只会通过网络连接并发送一些数据,数据小于 1MB 并在几毫秒内传输。但重要的是,那个时间应该 bot 干扰主流。

标签: c# .net multithreading task task-parallel-library


【解决方案1】:

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

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

TaskCreationOptions

LongRunning 指定任务将长期运行, 粗粒度操作涉及更少、更大的组件 细粒度的系统。它为 TaskScheduler 提供了一个提示: 可能需要超额认购。超额订阅让您创建 多于可用硬件线程数的线程。它也是 向任务调度程序提供额外线程可能的提示 任务需要,这样它就不会阻塞前进 本地线程池上其他线程或工作项的进度 排队。

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

这是Stephen Toub - MSFTpost 的引用

在幕后,这将导致更多的线程数 被使用,因为它的目的是让 ThreadPool 继续 处理工作项,即使一项任务正在运行一个扩展 一段的时间;如果该任务在池中的线​​程中运行, 该线程将无法为其他任务提供服务。你通常会 仅当您通过性能测试发现不使用 LongRunning 使用它会导致处理其他工作的时间很长。

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

【讨论】:

  • 不,系统没有任何负载。即使在调试时我也看不到任务被安排,我只是触发了一项操作。该操作必须调用 fire and forget 操作。代码很简单 public void InAnOperation() { Do some stuff Task.Run(() => this.somemethod()) return; } 公共无效 someMethod() { }
【解决方案2】:

我不知道您以这种方式启动了多少任务,但除非数量真的很高,否则我会将调试重点放在被调用的方法上,而不是调用方。延迟 10 分钟更有可能是死锁或网络问题造成的,而不是任务调度造成的。

一些想法:

  1. 首先,我会在被调用方法的开头和结尾添加一些内容,让您知道它何时开始执行以及何时结束。就像带有时间戳和任务 ID 的 Debug.WriteLine()。
  2. 确保被调用的方法释放所有资源,即使它崩溃了。崩溃的线程/任务可能会被忽视,因为它们不会导致应用程序崩溃。
  3. 仔细检查被调用的方法是否是线程安全的。您过去可能很幸运,一些新的框架优化现在正在造成严重破坏。

【讨论】:

  • 再次,它运行的任务并不多。问题是任务甚至没有开始,我已经设置了一个断点以确保我可以在它开始时捕捉到它,但它永远不会命中它。我在少数地方使用 Fire and Forget,但似乎在任何地方都是一个常见问题。也没有资源问题。没有线程级别的争用。我还尝试了像 new Thread(() => {}).Start() 这样的显式线程。再次,没有运气。尝试将代码更改为最简单的列表添加方法 Task.Run(() => List.Add())。没有执行:(
  • 这听起来很奇怪,根据 Microsoft 更改日志,从 4.5 到 4.7 的线程或任务没有任何更改。您确定转换工作正常并且没有以某种方式破坏您的环境吗?如果你等待任务会发生什么?几秒钟后它有什么状态?
猜你喜欢
  • 2014-05-16
  • 2013-01-13
  • 2021-10-12
  • 2017-02-19
  • 2023-02-25
  • 2013-11-08
  • 2020-03-05
  • 2020-03-21
  • 1970-01-01
相关资源
最近更新 更多