在使用TaskCreationOptions.LongRunning标志创建的任务后,我负责清理吗?

Inv*_*ion 7 .net c# task-parallel-library

当您创建Taskwhile时,指定TaskCreationOptions.LongRunning专门为该任务创建的新线程.如果未指定,TaskCreationOptions.LongRunning则使用线程池.

如果我错了,请纠正我,但如果使用了线程池,则不需要dispose()任务(只要你没有在任务中使用任何同步对象,比如Wait()在子任务上).

如果是这种情况,我是否负责清理使用该TaskCreationOptions.LongRunning标志创建的额外线程?

如果是,则以下是可接受的模式:

var task = Task.Factory.StartNew(() => {...}, TaskCreationOptions.LongRunning);

task.ContinueWith(x => task.Dispose());
Run Code Online (Sandbox Code Playgroud)

注意如何,ContinueWith没有TaskContinuationOptions.LongRunning,所以它应该使用线程池.

尽管如此,我已经读过将任务状态移动到的线程Completed,Faulted或者Cancelled运行延续的更改.

如果有人能够对此有所启发,我将非常感激.

Nic*_*ler 6

绝对不要Dispose()继续 - 你什么时候处理继续任务?

AFAIK,唯一的原因Task是一次性是清除等待任务时创建的等待句柄.如果您不等待任务,则永远不会创建等待句柄.无论如何,终结者最终会清理.

此外,如果任务创建了一个新线程,它将自行清理.


Hen*_*man 5

TaskContinuationOptions.LongRunning是对任务工厂/调度程序的提示,事情并没有像你描绘的那样固定.

我希望在ContinueWith同一个(longRunning)线程上执行,可能会也可能不会在ThreadPool上运行.

据我所知,任务的清理是自动的,所以我不打算在这里使用Dispose().