我有一份帐号清单。每一个账号我都需要调用方法ProcessAccount。大约有150,000个帐户需要处理,每个帐户的处理时间可能在.5到2秒之间。
我想以某种方式设置线程,以便我可以处理4个帐户在同一时间,例如。
有没有简单的模式可供我使用?
我希望能够做的是启动4个线程处理前4个帐户,然后作为每个单独的线程完成启动另一个线程与下一个帐户,直到所有的帐户都已被处理。
发布于 2012-09-12 02:16:41
这很容易通过TPL (任务并行库)来处理。它看起来会像这样
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核)。
发布于 2012-09-12 02:18:44
使用PLinq:
var accounts = //some 150,000 account numbers
accounts.AsParallel().ForAll(ProcessAccount);或者,如果需要其他参数,请使用lambda表达式:
accounts.AsParallel().ForAll(account => ProcessAccount(account, argument2, argument3));https://stackoverflow.com/questions/12375549
复制相似问题