上下文:根据我们在某些Azure功能中使用的服务,我们有一项任务可能需要30秒到5分钟。
我们计划监视该任务对象的当前状态,以确保它正在运行并且没有被取消/出现故障。
有两种方法可以绕过它:
- 创建一个任务,运行它,然后在主任务完成后取消它。或者,可以使用Task.Delay和带有条件的一段时间
- 创建一个线程,运行它并等待它完成(使用while条件以避免while永远运行(
我们做了一些研究,并意识到两者都有利弊。但我们仍然不确定哪种方法是最好的,也不确定为什么。
在类似的场景中,您会使用什么?任务、线程或其他什么?
使用线程有点浪费,但稍微可靠一些。
-
这是浪费,因为每个线程只为其存在分配1MB的内存。
-
它更可靠,因为它不依赖于运行计时器事件的
ThreadPool
线程的可用性。对ThreadPool
线程的需求突然爆发可能会使ThreadPool
在几秒钟甚至几分钟内(在极端情况下(处于饥饿状态。
因此,如果浪费1MB内存对应用程序来说不是问题,请使用线程。另一方面,如果事件时间安排的绝对精度不重要,请使用任务。
您也可以使用以选项LongRunning
开头的任务,但这本质上是一个伪装的线程。