【问题标题】:Task starts with delay任务开始延迟
【发布时间】:2019-03-11 16:57:02
【问题描述】:

我通过以下方式创建和启动任务:

 Task task = new Task(() => controller.Play());
 task.Start();

由于某种原因,有时任务开始延迟大约 7-10 秒。 我并行使用 6 个任务,最大任务数为 32767,可用 32759 这是我在创建任务之前记录的内容,因此不可能达到最大任务数。我在任务应该执行的 controller.Play() 方法的第一行代码写日志,所以没有锁或任何可以让任务等待的东西。

【问题讨论】:

  • 您如何以及在何处测量延迟?也许controller.Play 电话有启动成本。
  • 旁注:建议开始任务的方式是使用Task.Run()
  • 我已经调整它以使用 Run() 而不是 Start() 仍然是同样的问题。我意识到程序在另一个线程上从 10MB 大的 JSON 文件反序列化,这大约需要 10 秒,一旦完成,调用 controller.Play() 的任务就会启动。我试图删除那些从 json 反序列化的代码行,然后根本没有延迟。我也尝试让 controller.Play() 为空函数,一旦从 json 反序列化完成,它仍然会被调用。

标签: c# task-parallel-library


【解决方案1】:

长时间运行的任务,例如需要 10 秒的 100MB 反序列化,应该是,嗯,好吧,以 long-running tasks 运行:-)

根据当前的实现,长时间运行的任务始终在专用线程上运行,并且不会对线程池造成压力。

在您的情况下,您可能只有两个任务 - 反序列化和播放器。 TaskScheduler 的工作假设任务是短暂的,在这种情况下,它显然将“玩家”任务安排在“反序列化”任务之后运行。

【讨论】:

  • 我有几个长时间运行的任务,它们会在短时间内完成一些工作,然后休眠 1 秒,然后除了从 10MB 文件中读取之外再做一些工作。我应该把所有这些长时间运行在后台工作人员上吗?
  • 后台worker也使用线程池。将它们全部放在单独的线程上。
  • 我确实使用了长时间运行的任务选项,现在可以正常工作了,谢谢
猜你喜欢
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 2022-09-30
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
  • 2017-03-25
相关资源
最近更新 更多