我正在尝试像这样实现SmartThreadPool:http://www.codeproject.com/Articles/7933/Smart-Thread-Pool
但问题是我想要一个游泳池,我会在这个游泳池中不断添加一些值。当一个计算值的过程结束时,它将从池中获得新值以完成工作。我想有5个线程来计算池中的值,以便一切都可以异步工作。作业完成后,它将从池中获取新值。
但我有一个问题,如何使用智能线程池实现它。结果方法总是阻止下一次执行并等待完成。以及如何为现有池添加值?
这是否可以使用智能线程池或如何启动?
答案 0 :(得分:0)
解决此问题的最佳方法是使用ConcurrentQueue<T>
中包含的BlockingCollection<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