SmartThreadPool如何在池中添加值并运行多个线程以从一个池中读取

时间:2013-11-25 22:00:54

标签: c# multithreading threadpool

我正在尝试像这样实现SmartThreadPool:http://www.codeproject.com/Articles/7933/Smart-Thread-Pool

但问题是我想要一个游泳池,我会在这个游泳池中不断添加一些值。当一个计算值的过程结束时,它将从池中获得新值以完成工作。我想有5个线程来计算池中的值,以便一切都可以异步工作。作业完成后,它将从池中获取新值。

但我有一个问题,如何使用智能线程池实现它。结果方法总是阻止下一次执行并等待完成。以及如何为现有池添加值?

这是否可以使用智能线程池或如何启动?

1 个答案:

答案 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