多线程foreach

时间:2018-04-15 20:13:22

标签: c# multithreading

我有一个基本上这样做的控制台应用程序:

foreach (var database in databases)
{
    using (var db = new MyDbContext(database.Name))
    {
         //do some calculations, inserting of thousands of rows, removing thousands of rows, etc
    }
}

一切正常。但我想改进它。所以我在考虑同时处理多个数据库。我目前拥有的数据库数量大约为100个,并且随着时间的推移而增长。所以我认为Parallel.ForEach太贵了。什么是最好的方法?

1 个答案:

答案 0 :(得分:0)

如果我没记错的话,Parallel.ForEach在线程池上运行。它使用调度程序来计算它将使用多少个线程(https://msdn.microsoft.com/en-us/library/system.threading.tasks.paralleloptions.maxdegreeofparallelism(v=vs.110).aspx)。但是,您可以通过将ParallelOptions与MaxDegreeOfParallelism(How can I limit Parallel.ForEach?)一起传递来设置Parallel.ForEach将使用的线程数。唯一的问题是如果您需要将不同的数据库操作链接在一起;你需要使用ContinueWith扩展来做到这一点。

就个人而言,我更喜欢将任务加载到ConcurrentQueue中,并通过使用Task.Run()调用方法来启动特定的工作线程计数来处理队列。这将允许您重新排队任何失败的任务或执行其他一些通知任务。您可以使用Parallel.ForEach执行此操作,但我认为队列过程对此更有意义(对我而言)。