2

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

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

如果我使用线程而不是任务,它们会立即开始运行,还是 .net 会像任务一样启动它们?

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

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

这就是我开始任务的方式

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

时间:2019-04-01 标签:c#wpf 4.5

4

2 回答 2

5

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

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

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

于 2013-03-03T14:29:53.207 回答
5

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

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

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

您还可以使用StartNew允许您调整选项和调度程序设置的过载来启动任务。但是请注意,在大量线程上运行可能会导致性能下降。线程创建和上下文切换具有巨大的成本,并且运行数千个线程会,IMO,适得其反。

于 2013-03-03T14:33:38.943 回答