Task.Factory.StartNew()是否保证至少创建一个新线程?

Gaz*_*yer 1 c# multithreading threadpool task-parallel-library

我知道TPL不一定为并行集中的每个任务创建一个新线程,但是它总是创建至少一个吗?例如:

private void MyFunc()
{
    Task.Factory.StartNew(() =>
    {
        //do something that takes a while   
    });

    DoSomethingTimely();   //is this line guaranteed to be hit immediately?
}
Run Code Online (Sandbox Code Playgroud)

编辑:澄清:是的,我的意思是保证执行的线程MyFunc()不会被用来执行//do something that takes a while.

Dam*_*ver 7

这取决于当前的默认TaskScheduler值.你可以设想某人做一些可怕的事情,比如在SynchronousTaskScheduler执行期间执行任务主体QueueTask并在返回之前将其设置为完成.

假设你没有让别人弄乱你的任务调度程序,你不必担心它.


Jon*_*eet 5

这取决于"立即"你的意思,但我认为假设TPL不会劫持你当前正在执行的线程来同步运行任务中的代码是合理的,如果这就是你的意思.至少不与正常的调度......你也许可以编写自己的调度器这样做,但你通常可以假设,StartNew安排的任务,而不是仅仅运行它内联.