我有一个帐号列表。 Foreach帐号我需要调用方法ProcessAccount
。将需要处理大约150,000个帐户,每个帐户可能需要0.5到2秒才能处理。
我想以某种方式设置线程,所以我可以一次处理4个帐户。
我可以使用一个简单的模式吗?
我希望能够做的是开始处理前4个帐户的4个线程,然后在完成每个单独的线程后,使用下一个帐户启动另一个线程,直到所有帐户都被处理完毕。
答案 0 :(得分:12)
使用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中,TPL对使用的线程数做出了非常好的决定。
正如@Servy在评论中指出的那样,除非你有一个非常具体的理由将代码限制为4个线程,否则最好让TPL自行选择使用多少个线程。这样,如果2018年在128核处理器上运行相同的代码,那么在您继续使用其他东西之后很久就可以使用所有128个内核了。
答案 1 :(得分:1)
使用PLinq:
var accounts = //some 150,000 account numbers
accounts.AsParallel().ForAll(ProcessAccount);
或者,如果需要其他参数,请使用lambda表达式:
accounts.AsParallel().ForAll(account => ProcessAccount(account, argument2, argument3));