2013-11-25 68 views
0

我想實現SmartThreadPool就像讀運行多個線程這一個:http://www.codeproject.com/Articles/7933/Smart-Thread-PoolSmartThreadPool如何在池添加值,並從一個池

但問題是,我想有一個游泳池,我會constatnly在這個池中增加了一些值。當一個計算價值的過程將被完成時,它將從池中獲得新的價值來完成工作。我想要有5個線程來計算池中的值,以便一切都可以工作異步。工作完成後,會從池中獲得新的價值。

但我有一個問題,如何實現與智能線程池。結果方法始終阻止下一次執行並等待完成。以及如何將值添加到現有的池?

這是甚至可能與智能線程池或如何啓動?

+1

爲什麼不使用併發生產者/消費者集合,其中值是通過一些外部源增加,以及每5個線程在準備好處理另一個項目時將取消一個值。 – Paccc

+0

[ConcurrentQueue ](http://msdn.microsoft.com/en-us/library/dd267265(v = vs.110).aspx)對我來說似乎是一個很好的解決方案!另外,你能否給我們一個[SSCCE](http://www.sscce.org/)? –

+0

因此使用ConcurrentQueue的解決方案比任務更好? – senzacionale

回答

0

解決此問題的最佳方法是使用包裝在BlockingCollection<T>中的ConcurrentQueue<T>。使用這個結果對象並從任何地方向它排列值。然後創建5個循環中運行處理方法的任務。每次線程完成一個項目的處理時,它都會嘗試從集合中取出另一個項目。如果隊列爲空,則會阻塞,直到添加新值,或在BlockingCollection上調用AddingComplete()。

// create a blocking collection 
// the constructor will take an IProducerConsumerCollection 
// or it will use a ConcurrentQueue<T> by default if none is provided 
var blockingCollection = new BlockingCollection<String>(); 

// generate items and add them to the collection 
Task.Factory.StartNew(() => { 
    for (int i = 0; i < 100; i++) { 
     blockingCollection.Add("value" + i); 
    } 
    // mark adding as complete so the foreach loops 
    // below will exit when the collection is empty 
    blockingCollection.AddingComplete(); 
}); 

// create worker 1 to process items 
Task.Factory.StartNew(() => { 
    foreach (string value in blockingCollection.GetConsumingEnumerable()) { 
     Console.WriteLine("Worker 1: " + value); 
    }    
}); 

// create worker N to process items 
Task.Factory.StartNew(() => { 
    foreach (string value in blockingCollection.GetConsumingEnumerable()) { 
     Console.WriteLine("Worker N: " + value); 
    }    
}); 

這裏是一個很好的頁面瞭解更多關於它,看到其他的例子:http://www.codethinked.com/blockingcollection-and-iproducerconsumercollection