首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#中处理具有N个线程的队列的简单方法?

在C#中处理具有N个线程的队列的简单方法?
EN

Stack Overflow用户
提问于 2012-09-12 02:15:24
回答 2查看 650关注 0票数 7

我有一份帐号清单。每一个账号我都需要调用方法ProcessAccount。大约有150,000个帐户需要处理,每个帐户的处理时间可能在.5到2秒之间。

我想以某种方式设置线程,以便我可以处理4个帐户在同一时间,例如。

有没有简单的模式可供我使用?

我希望能够做的是启动4个线程处理前4个帐户,然后作为每个单独的线程完成启动另一个线程与下一个帐户,直到所有的帐户都已被处理。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-12 02:16:41

这很容易通过TPL (任务并行库)来处理。它看起来会像这样

代码语言:javascript
复制
ParallelOptions options = new ParallelOptions() { MaxDegreeOfParallelism = 4 };
Parallel.ForEach(accounts, options, a =>
{
    ProcessAccount(a);
});

http://msdn.microsoft.com/en-us/library/dd782721.aspx

请注意,TPL可能决定运行少于4个并发线程,但不会根据指定的选项运行超过4个线程。例如,如果它确定所提供的lamda (调用ProcessAccount)是受CPU限制的,并且系统上的CPU核心少于4个,则它可能会这样做。一般而言,特别是在.NET 4.5中,第三方逻辑对要使用的线程数量做出了非常好的决定。

正如@Servy在注释中指出的那样,除非您有非常明确的理由将代码限制在4个线程内,否则最好让TPL自己确定要使用多少个线程。这样,如果相同的代码在2018年运行在128核处理器上,那么在您转移到其他事情很久之后,它可以免费使用所有128核)。

票数 12
EN

Stack Overflow用户

发布于 2012-09-12 02:18:44

使用PLinq:

代码语言:javascript
复制
var accounts = //some 150,000 account numbers
accounts.AsParallel().ForAll(ProcessAccount);

或者,如果需要其他参数,请使用lambda表达式:

代码语言:javascript
复制
accounts.AsParallel().ForAll(account => ProcessAccount(account, argument2, argument3));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12375549

复制
相关文章

相似问题

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