我正在尝试像这样实现SmartThreadPool:http://www.codeproject.com/Articles/7933/Smart-Thread-Pool
但问题是,我想要一个池,我会在这个池中固定地添加一些值。当一个计算值的过程结束时,它将从池中获得新的值来完成这项工作。我想有5个线程计算池中的值,这样一切都可以异步工作。当作业完成时,它将从池中获取新值。
但是我遇到了一个问题,如何用Smart Thread Pool实现它。Result方法总是阻塞下一次执行,并等待完成。以及如何向已存在的池中添加值?
有没有可能使用智能线程池,或者如何启动?
发布于 2013-11-26 23:32:30
解决这个问题的最好方法是使用包装在BlockingCollection
中的ConcurrentQueue
。使用这个结果对象,并将来自任何地方的值排入队列。然后创建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
https://stackoverflow.com/questions/20204281
复制相似问题