工作一段时间后注意到,即使你刷出1000个任务,它们也不会立即开始。所以基本上,即使我启动1000个任务,其中100个正在运行,900个等待运行。
所以我的问题是,它们是如何开始的?.net如何决定何时开始运行任务或使其等待运行?我可以遵循什么方法来立即启动它们?我希望有一定数量的任务/线程一直在运行。
如果我使用线程而不是任务,它们会立即开始运行还是。net会像启动任务一样启动它们?
问题可能不是很清楚,所以请让我澄清一下。
基本上我是产卵1000(保持这个数字衍生。当一个任务完成时,启动另一个任务)任务,但只有125个Running
和875个WaitingToRun
:)
这是我如何开始任务
Task.Factory.StartNew(() =>
{
startCheckingProxies();
});
c# WPF 4.5
如果您正在谈论Task
对象,它们在线程池上运行,因此它们不会立即通过在单独的线程上运行每个对象来启动。相反,有限数量的任务最初将在来自池的线程上启动,然后这些线程将被重用以运行下一个任务,依此类推。
当然,这只是一个高层次的描述,背后的逻辑更复杂,并实现了大量的优化。
你可以在这里和这里找到更多信息
你也可以用StartNew
的过载来启动任务,它可以让你调整选项和调度器设置。但是请注意,在大量线程上运行可能会导致更差的性能。线程创建和上下文切换的成本很高,在我看来,运行数千个线程会适得其反。
任务实际上只是底层的线程。
通过生成新线程可以获得的好处是有限的。每个线程都有一些开销,所以在某些时候,开销将超过生成一个新线程的好处。如果您将这些任务的生成留给框架,它将自行决定一次要运行多少线程,并且它将根据它认为可以从这些线程中获得多少生产力来做出决定。
我很确定最优的数字不会是1000;我写过Windows服务,其中同时运行的最佳线程数是机器中的核心数(在我的情况下,它是4)。