在C#中使用N个线程处理队列的简便方法?

AWe*_*eim 7 c# multithreading

我有一个帐号列表.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个核心.