经过一段时间的注意,即使你产生1000个任务,它们也不会立即启动。所以基本上即使我开始执行1000个任务,其中100个正在运行,其中900个正在等待运行。
所以我的问题是,他们是如何开始的? .net如何确定何时开始运行任务或使其等待? 我可以遵循什么方法来立即启动它们? 我想让一定数量的任务/线程一直在运行。
如果我使用线程代替任务,他们会立即开始运行,或者.net会启动它们,因为它喜欢任务吗?
问题可能不太清楚,所以请让我澄清一下。
基本上我正在产生1000(保持这个数字产生。当1个任务完成开始另一个任务时)任务但只有125个Running
和875个WaitingToRun
:)
这就是我开始任务的方式
Task.Factory.StartNew(() =>
{
startCheckingProxies();
});
c#wpf 4.5
答案 0 :(得分:5)
任务实际上只是一线索引。
通过生成新线程可以获得多少好处是有限的。每个线程都有一些开销,因此在某些时候,开销将超过产生新线程的好处。如果你将这些任务的产生留给框架,那么它将自己决定它将同时运行多少个线程,并且它将根据它认为可以从这些线程获得多少生产力来做出决定。
我很确定最佳数字不会是千分之一;我编写了Windows服务,其中同时运行的最佳线程数是机器中的核心数(在我的例子中,它是4)。
答案 1 :(得分:5)
如果您正在讨论Task
个对象,它们会在线程池之上运行,因此它们不会立即通过在单独的线程上运行它们而立即启动。相反,有限数量的任务最初将在来自池的线程上启动,然后线程将被重用以运行下一个任务,依此类推。
当然,这只是一个高级描述,背后的逻辑更复杂,并实现了很多优化。
您还可以使用StartNew
的重载启动任务,该任务允许您tweak options and scheduler settings。但请注意,在大量线程上运行可能会导致性能下降。线程创建和上下文切换具有相当大的成本,并且运行数千个线程,IMO,适得其反。