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

Mon*_*RPG 2 c# wpf multithreading multitasking threadpool

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

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

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

问题可能不是很清楚,所以请让我澄清一下.

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

这就是我开始任务的方式

        Task.Factory.StartNew(() =>
        {
            startCheckingProxies();
        });
Run Code Online (Sandbox Code Playgroud)

c#wpf 4.5

Rob*_*vey 5

任务实际上只是引擎盖下的线程.

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

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

  • 任务不是线程.任务就像分配,线程就像工人; 你可以有一百万个任务,只有一个线程; 任务不会自动引发多个线程. (2认同)
  • @MonsterMMORPG:在你的场景中,每个任务都有自己的线程,因为你告诉任务并行库*每个任务都是CPU绑定*.TPL正在尝试为任务分配线程,以便最有效地使用处理器,但是如果你在说谎这些任务是否受CPU限制,那么它就不会做得很好而且它也会分配方式很多线程.你没有在这里使用合适的工具; 当你有一堆需要安排到各种处理器的CPU密集型工作时,请使用TPL. (2认同)

Zde*_*vic 5

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

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

您可以在这里这里找到更多信息

您还可以启动具有重载的任务,StartNew从而可以调整选项和调度程序设置.但请注意,在大量线程上运行可能会导致性能下降.线程创建和上下文切换具有显着的成本,并且运行数千个线程,IMO,适得其反.