Multi threaded foreach



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

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太贵了。最好的方法是什么?

如果我

没记错的话,Parallel.ForEach在线程池上运行。 它使用调度程序来确定它将使用多少线程(https://msdn.microsoft.com/en-us/library/system.threading.tasks.paralleloptions.maxdegreeofparallelism(v=vs.110(.aspx(。 但是,您可以通过将 ParallelOptions 与 MaxDegreeOfParallelism 一起传递给它来设置 Parallel.ForEach 将使用的线程数(如何限制 Parallel.ForEach?(。 唯一的问题是,如果您需要将不同的数据库操作链接在一起;您需要使用 ContinueWith 扩展来执行此操作。

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

最新更新