我有一个帐号列表.Foreach帐号我需要调用方法ProcessAccount.将需要处理大约150,000个帐户,每个帐户可能需要0.5到2秒才能处理.
我想以某种方式设置线程,所以我可以一次处理4个帐户.
我可以使用一个简单的模式吗?
我希望能够做的是启动4个线程处理前4个帐户,然后在每个单独的线程完成后,使用下一个帐户启动另一个线程,直到所有帐户都被处理完毕.
Eri*_* J. 12
这很容易用TPL(任务并行库)处理.它看起来像
ParallelOptions options = new ParallelOptions() { MaxDegreeOfParallelism = 4 };
Parallel.ForEach(accounts, options, a =>
{
ProcessAccount(a);
});
Run Code Online (Sandbox Code Playgroud)
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个核心.