如何编写一个 C# Parallel.ForEach 循环,其中在代码的一部分中,一次只能有一个线程处于活动状态?

How do I write a C# Parallel.ForEach loop where during one part of the code, only one thread can be active at a time?

不确定在没有大量开销的情况下这是否可行,但我想我会问。

这是当前进程:

Parallel loop over locations
    Sequential Loop over SQL load operations for each location

这工作得很好,除了如果同时执行的线程超过 1 个,一个过程往往会死锁。

是否可以确保一旦死锁过程运行,如果所有其他线程试图执行相同的过程,它们会一直等到死锁完成?

我感觉涉及到锁定,但我做的还不够确定。

 Parallel loop over locations
   Sequential Loop over SQL load operations for each location

我发现动态改变并行线程数 运行ning 的唯一方法是使用任务和 SemaphoreSlim 逐渐增加线程数 运行ning .然而,这不是您要找的。但是,根据您对要并行 运行 的过程的描述,您表明您正在从 SQL 加载数据。这表明您应该问的问题是您的查询为什么会死锁。如果您使用的是 SQL 服务器,那么我建议您查看 Brent Ozar 的 link、Locking and Blocking in SQL Server。当我遇到死锁问题时,我发现这个和他网站上的其他资源非常有用。

lock 命令满足了我的需要。

这是我如何解决它的精简版:

// This is a static variable in my main Program class
private static readonly object processLock = new object();

// This is within my processing method
Parallel.ForEach(Stores, new ParallelOptions() { MaxDegreeOfParallelism = maxdop }, store =>
{
    foreach (var sequenceFeed in Sequences.OrderBy(x => x.SequenceOrder))
    {                    
        if (sequenceFeed.Identifier == "UPC") // UPC deadlocks due to pricing code, so lock for single threaded execution
        {
            lock (processLock)
            {
                feed.Process();
            }
        }
        else
            feed.Process();
    }              
});

感谢@Scott Hannen 在评论中的指导。