Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 新任务是否总是在线程池线程上执行?_C#_Multithreading_Async Await_Task Parallel Library - Fatal编程技术网

C# 新任务是否总是在线程池线程上执行?

C# 新任务是否总是在线程池线程上执行?,c#,multithreading,async-await,task-parallel-library,C#,Multithreading,Async Await,Task Parallel Library,这可能是一个简单而愚蠢的问题。我创建了如下任务: Task<bool> myTask = new Task<bool>(() => { Debug.WriteLine("Task fired"); return true; }); // I know I can create it with Task.Run, but this is for purpose of the sample myTask.Start(); Task myTask=newtask(()

这可能是一个简单而愚蠢的问题。我创建了如下任务:

Task<bool> myTask = new Task<bool>(() => { Debug.WriteLine("Task fired"); return true; });
// I know I can create it with Task.Run, but this is for purpose of the sample
myTask.Start(); 
Task myTask=newtask(()=>{Debug.WriteLine(“Task fired”);返回true;});
//我知道我可以用Task.Run创建它,但这是用于示例的
myTask.Start();
关于这一点,我有几个问题:

  • 它总是在线程池线程上运行吗
  • 如果它在线程池上运行,是否有可能由UI线程运行?如果你有工作,你能阻止吗
  • 对于大量任务,能否将少量任务分配给一个线程(排队),然后逐个运行?或者每个任务都有自己的线程
我读过一些文档,但没有找到具体的解释。例如,一般说来关于任务:

因为任务对象执行的工作通常在线程池线程上异步执行,而不是在主应用程序线程上同步执行


回答第一点:“从.NET Framework 4开始,使用线程池的最简单方法是使用任务并行库(TPL)。默认情况下,[强调添加],任务和任务等并行库类型使用线程池线程来运行任务。”

它总是在线程池线程上运行吗

不一定。如果查看,可以传递值
TaskCreationOptions.LongRunning
。如果它在内部使用
TaskScheduler.Default
,这将创建一个新线程,它不是线程池的线程之一

通常,建议您在线程池上对线程进行排队。如果要传递自定义的
任务调度器
,可以使用更高级的,但我建议只在真正需要时使用它

如果它在ThreadPool上运行,是否有可能由UI运行 线如果你有工作,你能阻止吗

不。UI线程不是线程池使用的池的一部分

如果任务数量很大,则可以将少量任务分配给一个线程 (排队)然后一个接一个地运行?或者每个任务都有自己的 线


这是特定于正在使用的
TaskScheduler
的实现。如果我们查看线程池(这是在没有传递自定义线程的情况下的默认值),线程池从恒定数量的线程开始,并根据需要进行扩展。不能保证每个委托将在不同的线程上执行。但是,您可以创建一个自定义的
任务调度器
,在这里您可以控制执行任务的调度机制。

至于最后一个问题和答案,我可以补充一点,线程池正在使用工作窃取,也就是说,当一个线程“失去工作”时,它将从其他线程的队列中“窃取”任务。