【发布时间】:2013-06-20 18:46:24
【问题描述】:
我有一个生产者从资源中获取用户并将它们放入 ConcurrentQueue,然后我想要做的是使用多个消费者并处理所有用户并从另一个资源中获取他们的信息。
public void Populate(IEnumerable<Users> users){
_queue.Enqueue(users);
// here single threaded
}
public void Process(){
// here i want this to be processed by multiple consumers
// say multiple threads so that I can finish processing them.
}
我的问题是,我应该使用线程吗?任务?线程池?
【问题讨论】:
-
随心所欲;他们都可以完成这项工作。请注意,它们是建立在彼此之上的。 Task 使用线程池(一般),线程池使用线程实现。
-
@Servy:只是补充一点,虽然他们都可以完成这项工作,但在一般情况下,如果任务之间存在一些关系,如继续或分支,最好使用更高级别的 API,如 TPL此外,还与 C# 4.5 的新 await/async 功能无缝集成。
-
@Pragmateek 归根结底,这完全是个人喜好。如果有人发现将
Thread用于所有事情而不是任务更容易,他们可以这样做。大多数人似乎发现任务更容易处理,但这只是一种意见。这也取决于问题;有些问题更适合不同的抽象。另请注意,除了这三个之外,还有很多并行化框架/抽象,一些在 BCL 中和许多第 3 方扩展/替换。 -
还有并行foreach,我的问题是这里的最佳实践是什么?
-
@DarthVader:就像 Servy 所说,这首先是个人喜好问题。从学术的角度来看,我认为最好先掌握线程之类的低级内容,然后再转向 TPL 等更高级别的抽象,因为它们可以让您以更高效的方式编写更具可读性的代码。
标签: c# multithreading queue