繁体   English   中英

新的Task总是在ThreadPool线程上执行吗?

[英]Is new Task always executed on ThreadPool thread?

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

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线程上运行吗?

不必要。 如果你看一下使用TaskCreationOptionsTask构造函数重载 ,你可以传递值TaskCreationOptions.LongRunning 如果在内部它使用TaskScheduler.Default ,这将创建一个新线程,它不是线程池之一。

通常,建议您使用Task.Run对线程池上的线程进行排队。 如果你想传递一个自定义的TaskScheduler ,你可以使用更高级的Task.Factory.StartNew ,但我建议只在真正需要时使用它。

如果它在ThreadPool上运行是否有可能由UI线程运行? 如果有工作 - 可以阻止它吗?

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

在大量任务的情况下,很少可以分配给一个线程(排队),然后一个接一个地运行? 或者每个任务都有自己的线程?

这是特定于正在使用的TaskScheduler实现。 如果我们查看ThreadPoolTaskScheduler (在没有传递自定义的情况下是默认值),则ThreadPoolTaskScheduler以一定量的线程开始,并根据需要进行扩展。 不保证每个代理将在不同的线程上执行。 但是,您可以创建自定义TaskScheduler ,您可以在其中控制为exectuion安排任务的机制。

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

https://msdn.microsoft.com/en-us/library/0ka9477y(v=vs.110).aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM