2013-12-09 53 views
0

我正在填補一個任務工廠的任務是這樣的(僞):任務廠力更多的任務需要從頭開始

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%等待硬件/網絡資源響應,因此在並行處理過程中由於速度而產生巨大影響。 –

回答

1

據我所知TaskFactory使用線程池,所以你可以嘗試SetMaxThreads方法。但實際上它旨在優化資源消耗。所以我認爲你的效率不會提高。

你也可以嘗試手動啓動線程new Thread(),這應該可以幫助你立即啓動多個線程,但是我不認爲你會得到很多效率的提高。

+0

taskfactory正在做它應該做的事情,但是如果您運行大量隊列,則需要超過10分鐘才能達到最高效率。我只想加快這個過程。 –

+0

我沒說沒有。由於其優化機制,它在10分鐘後才達到最大值。它不知道要從程序員那裏等待很多短任務或長或長任務(如你的情況)。嘗試使用'SetMinThreads',如果你知道這個值。 MSDN表示TP將立即創建這個線程計數。 – Tony

+0

生病請試試這個。聽起來不錯。 btw theadpool永遠達不到最高。它會產生任務/線程直到內存溢出。它不像你期望的那樣聰明 –