.net没有按照我的命令启动任务 - 启动新任务的逻辑是什么

时间:2013-03-03 14:22:44

标签: c# wpf multithreading threadpool multitasking

经过一段时间的注意,​​即使你产生1000个任务,它们也不会立即启动。所以基本上即使我开始执行1000个任务,其中100个正在运行,其中900个正在等待运行。

所以我的问题是,他们是如何开始的? .net如何确定何时开始运行任务或使其等待? 我可以遵循什么方法来立即启动它们? 我想让一定数量的任务/线程一直在运行。

如果我使用线程代替任务,他们会立即开始运行,或者.net会启动它们,因为它喜欢任务吗?

问题可能不太清楚,所以请让我澄清一下。

基本上我正在产生1000(保持这个数字产生。当1个任务完成开始另一个任务时)任务但只有125个Running和875个WaitingToRun:)

这就是我开始任务的方式

        Task.Factory.StartNew(() =>
        {
            startCheckingProxies();
        });

c#wpf 4.5

2 个答案:

答案 0 :(得分:5)

任务实际上只是一线索引。

通过生成新线程可以获得多少好处是有限的。每个线程都有一些开销,因此在某些时候,开销将超过产生新线程的好处。如果你将这些任务的产生留给框架,那么它将自己决定它将同时运行多少个线程,并且它将根据它认为可以从这些线程获得多少生产力来做出决定。

我很确定最佳数字不会是千分之一;我编写了Windows服务,其中同时运行的最佳线程数是机器中的核心数(在我的例子中,它是4)。

答案 1 :(得分:5)

如果您正在讨论Task个对象,它们会在线程池之上运行,因此它们不会立即通过在单独的线程上运行它们而立即启动。相反,有限数量的任务最初将在来自池的线程上启动,然后线程将被重用以运行下一个任务,依此类推。

当然,这只是一个高级描述,背后的逻辑更复杂,并实现了很多优化。

您可以找到更多信息herehere

您还可以使用StartNew的重载启动任务,该任务允许您tweak options and scheduler settings。但请注意,在大量线程上运行可能会导致性能下降。线程创建和上下文切换具有相当大的成本,并且运行数千个线程,IMO,适得其反。