是始终在ThreadPool线程上执行的新任务
本文关键字:执行 新任务 线程 ThreadPool | 更新日期: 2023-09-27 18:26:14
这可能是一个简单而愚蠢的问题。我创建了一个这样的任务:
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();
我对此有几个问题:
- 它总是在ThreadPool线程上运行吗
- 如果它在ThreadPool上运行,是否有机会由UI线程运行?万一有工作——能阻止它吗
- 在大量任务的情况下,是否可以将少数任务分配给一个线程(排队),然后一个接一个地运行?还是每个任务都有自己的线程
我读了一些文件,但没有找到具体的解释。例如,任务文档一般介绍任务:
因为Task对象执行的工作通常在线程池线程上异步执行,而不是在主应用程序线程上同步执行。。。
它总是在ThreadPool线程上运行吗?
不一定。如果查看采用TaskCreationOptions
的Task
构造函数重载,则可以传递值TaskCreationOptions.LongRunning
。如果它在内部使用TaskScheduler.Default
,这将创建一个不是线程池的新线程。
通常,建议您使用Task.Run
对线程池中的线程进行排队。如果你想传递自定义的TaskScheduler
,你可以使用更高级的Task.Factory.StartNew
,但我建议只在真正需要的时候使用它。
如果它在ThreadPool上运行,是否有机会由UI运行线万一有工作——能阻止它吗?
没有。UI线程不是ThreadPool使用的池的一部分。
在大量任务的情况下,可以为一个线程分配很少的任务吗(排队)然后一个接一个地运行?或者每个任务都有自己的线
这是特定于所使用的TaskScheduler
的实现方式。如果我们看看ThreadPoolTaskScheduler
(在没有传递自定义线程的情况下,它是默认的),线程池从恒定数量的线程开始,并根据需要进行扩展。不能保证每个委托都在不同的线程上执行。但是,您可以创建一个自定义的TaskScheduler
,在其中您可以控制调度执行任务的机制。
回答第一点:"从.NET Framework 4开始,使用线程池的最简单方法是使用任务并行库(TPL)。默认情况下[强调添加],类似Task和Task的并行库类型使用线程池线程来运行任务。"
https://msdn.microsoft.com/en-us/library/0ka9477y(v=vs.110).aspx