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
的实现。如果我们查看线程池(这是在没有传递自定义线程的情况下的默认值),线程池从恒定数量的线程开始,并根据需要进行扩展。不能保证每个委托将在不同的线程上执行。但是,您可以创建一个自定义的任务调度器
,在这里您可以控制执行任务的调度机制。至于最后一个问题和答案,我可以补充一点,线程池正在使用工作窃取,也就是说,当一个线程“失去工作”时,它将从其他线程的队列中“窃取”任务。