【问题标题】:Using task vs using a thread for task monitoring使用任务与使用线程进行任务监控
【发布时间】:2020-03-20 14:32:14
【问题描述】:

上下文:我们的任务可能需要 30 秒到 5 分钟,具体取决于我们在某些 Azure Functions 中使用的服务。

我们计划监控该任务对象的当前状态,以确保它正在运行并且没有被取消/出错。

有两种方法可以绕过它:

  • 创建一个任务,运行它,然后在主任务完成后取消它。或者,也可以将 Task.Delay 与带有条件的一段时间一起使用。
  • 创建一个线程,运行它并等待它完成(带有一个 while 条件以避免永远运行的一段时间)。

我们进行了一些研究,并意识到两者各有利弊。但我们仍然不确定哪种方法是最好的方法以及为什么

在类似的情况下,您会使用什么?任务、线程还是其他?

【问题讨论】:

  • 是由人工操作还是由程序监控?如果它是一个程序,那么您既不需要监视线程也不需要任务。只需为主要任务的完成附加一个延续。
  • 这只是一个while循环记录信息,所以不,没有复杂的监控。
  • 所以有一个日志例程,每 5 分钟写入一个日志文件“任务正在运行”或“任务已完成”?
  • 或多或少,就是这样,是的。

标签: c# multithreading task


【解决方案1】:

使用线程有点浪费,但稍微可靠一点。

  1. 这是浪费,因为每个线程分配1 MB的内存只是为了它的存在。

  2. 它更可靠,因为它不依赖于运行计时器事件的ThreadPool 线程的可用性。对ThreadPool 线程的需求突然激增可能会使ThreadPool starved 停留几秒钟,甚至几分钟(在极端情况下)。

因此,如果浪费 1 MB 内存对应用来说不是问题,请使用线程。另一方面,如果事件时间的绝对精度并不重要,请使用任务。

您也可以使用以选项LongRunning 开头的任务,但这本质上是一个伪装的线程。

【讨论】:

    猜你喜欢
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多