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
任务实际上只是引擎盖下的线程.
通过生成新线程可以获得多少好处是有限的.每个线程都有一些开销,因此在某些时候,开销将超过产生新线程的好处.如果您将这些任务的产生留给框架,它将自己决定它将同时运行多少个线程,并且它将根据它认为可以从这些线程获得多少生产力来做出决定.
我很确定最佳数字不会是千分之一; 我编写了Windows服务,其中同时运行的最佳线程数是机器中的核心数(在我的例子中,它是4).
如果您正在讨论Task对象,它们将在线程池的顶部运行,因此它们不会立即通过在单独的线程上运行每个对象而立即启动.相反,有限数量的任务最初将在来自池的线程上启动,然后线程将被重用以运行下一个任务,依此类推.
当然,这只是一个高级描述,背后的逻辑更复杂,并实现了很多优化.
您还可以启动具有重载的任务,StartNew从而可以调整选项和调度程序设置.但请注意,在大量线程上运行可能会导致性能下降.线程创建和上下文切换具有显着的成本,并且运行数千个线程,IMO,适得其反.
| 归档时间: |
|
| 查看次数: |
1700 次 |
| 最近记录: |