我已经使用TaskCreationOptions.LongRunning为后台进程创建任务,该任务从并发队列中读取请求并执行不同的操作。
task = Task.Factory.StartNew(x => PerformAction(), CancellationTokenObject, TaskCreationOptions.LongRunning);
我的理解是,这可能会创建一个单独的线程来调用“PerformAction()”,但当我对它进行分析时,它显示了 “System.Threading.ThreadHelper.ThreadStart”方法被多次调用。
每次调用“System.Threading.ThreadHelper.ThreadStart”时,这是否会创建一个新线程。在这种情况下,为TaskCreationOptions.LongRunning创建多个线程真的很奇怪。
答案 0 :(得分:1)
首先请注意,TaskCreationOptions.LongRunning
所做的事情没有记录,因此您不应该依赖它。 the documentation所说的是(强调我的):
它还为任务计划程序提供提示,该任务可能需要
现在,根据the reference source,默认TaskScheduler
对LongRunning
的作用是简单地启动一个新的背景Thread
。
ThreadHelper.ThreadStart
在哪里进来?这是Thread
的实现的一部分,并在线程启动时调用一次。看来its purpose is to make sure ExecutionContext
is flowed。
所以,我不知道你是如何得出TaskFactory.StartNew
TaskCreationOptions.LongRunning
多次调用ThreadHelper.ThreadStart
的结论,但它不应该,至少不是默认的TaskScheduler
。