任务厂力更多的任务需要从头开始

问题描述:

我正在填补一个任务工厂的任务是这样的(伪):任务厂力更多的任务需要从头开始

private int _taskcounter; 

剪断

var factory = new TaskFactory(); 
for(var i = 0;i<1000;i++) 
    factory.StartNew(() => doWork()); 

剪断

private void doWork(){ 
    Interlocked.Increment(ref _taskcounter); 
    //do some slow I/O work here 
    Interlocked.Decrement(ref _taskcounter); 
} 

如果你现在看了_taskcounter你可以看到
最初它的起始约10个任务 ,但它会以1到2个任务/秒的速度启动,直到队列完成。

微不足道的行为,不是吗?

我的问题是:
有没有办法强制任务工厂启动更多的任务?

我已经通过一些msdn示例类的变体来限制运行任务的最大值,以防止内存消耗过多。
或者这个有趣的测量方法或我的考虑是否有问题?

它没有必要在不同的线程中运行所有的工作,否则我wouldnt使用工厂
我只想从工厂的非工作窃取行为中受益。

对于一切依靠工厂的智慧。

+0

为什么你要一次开始这么多的任务?他们在做什么?确保多次并行加速过程? – svick

+0

它肯定会。正如我已经说过的那样,这些都是很慢的tcp io任务。 io任务有99%等待硬件/网络资源响应,因此在并行处理过程中由于速度而产生巨大影响。 –

据我所知TaskFactory使用线程池,所以你可以尝试SetMaxThreads方法。但实际上它旨在优化资源消耗。所以我认为你的效率不会提高。

你也可以尝试手动启动线程new Thread(),这应该可以帮助你立即启动多个线程,但是我不认为你会得到很多效率的提高。

+0

taskfactory正在做它应该做的事情,但是如果您运行大量队列,则需要超过10分钟才能达到最高效率。我只想加快这个过程。 –

+0

我没说没有。由于其优化机制,它在10分钟后才达到最大值。它不知道要从程序员那里等待很多短任务或长或长任务(如你的情况)。尝试使用'SetMinThreads',如果你知道这个值。 MSDN表示TP将立即创建这个线程计数。 – Tony

+0

生病请试试这个。听起来不错。 btw theadpool永远达不到最高。它会产生任务/线程直到内存溢出。它不像你期望的那样聪明 –