任务厂力更多的任务需要从头开始
我正在填补一个任务工厂的任务是这样的(伪):任务厂力更多的任务需要从头开始
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使用工厂
我只想从工厂的非工作窃取行为中受益。
对于一切依靠工厂的智慧。
据我所知TaskFactory使用线程池,所以你可以尝试SetMaxThreads方法。但实际上它旨在优化资源消耗。所以我认为你的效率不会提高。
你也可以尝试手动启动线程new Thread()
,这应该可以帮助你立即启动多个线程,但是我不认为你会得到很多效率的提高。
taskfactory正在做它应该做的事情,但是如果您运行大量队列,则需要超过10分钟才能达到最高效率。我只想加快这个过程。 –
我没说没有。由于其优化机制,它在10分钟后才达到最大值。它不知道要从程序员那里等待很多短任务或长或长任务(如你的情况)。尝试使用'SetMinThreads',如果你知道这个值。 MSDN表示TP将立即创建这个线程计数。 – Tony
生病请试试这个。听起来不错。 btw theadpool永远达不到最高。它会产生任务/线程直到内存溢出。它不像你期望的那样聪明 –
为什么你要一次开始这么多的任务?他们在做什么?确保多次并行加速过程? – svick
它肯定会。正如我已经说过的那样,这些都是很慢的tcp io任务。 io任务有99%等待硬件/网络资源响应,因此在并行处理过程中由于速度而产生巨大影响。 –