首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >SmartThreadPool如何将池中的值相加并运行多个线程以从一个池中读取

SmartThreadPool如何将池中的值相加并运行多个线程以从一个池中读取
EN

Stack Overflow用户
提问于 2013-11-26 06:00:54
回答 1查看 402关注 0票数 0

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

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

但是我遇到了一个问题,如何用Smart Thread Pool实现它。Result方法总是阻塞下一次执行,并等待完成。以及如何向已存在的池中添加值?

有没有可能使用智能线程池,或者如何启动?

EN

回答 1

Stack Overflow用户

发布于 2013-11-27 07:32:30

解决这个问题的最好方法是使用包装在BlockingCollection中的ConcurrentQueue。使用这个结果对象,并将来自任何地方的值排入队列。然后创建5个任务,在循环中运行您的处理方法。每次线程处理完一个项目时,它都会尝试将另一个项目从集合中出队。如果队列为空,它将阻塞,直到添加新的值,或者在BlockingCollection上调用AddingComplete()。

代码语言:javascript
代码运行次数:0
运行
复制
// 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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20204281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档