当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《新的Task总是在ThreadPool线程上执行吗?》经验,为你挑选了1个好方法。

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

Task myTask = new Task(() => { 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对象执行的工作通常在线程池线程上异步执行,而不是在主应用程序线程上同步执行...

Yuval Itzcha.. 11

它总是在ThreadPool线程上运行吗?

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

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

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

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

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

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



1> Yuval Itzcha..:

它总是在ThreadPool线程上运行吗?

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

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

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

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

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

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

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有