如何在多线程C#中为原子操作维护静态字典

How to maintain static Dictionary for atomic operation in multithreading C#

我一直在使用基于时间的 azure-function。 我想在我的函数应用程序中实现批处理的多线程。 azure 函数的实例每 10 秒创建一次。 我一直在管理一个具有 batchId 和 batchStatus 的静态字典(即 "Added"、"Processed"、"Failed") 这是示例代码

static Dictionary<string, string> processedFiles = new Dictionary<string, string>();

 public static async void Run([TimerTrigger(" */5 * * * * *")]TimerInfo myTimer, ILogger log)
        {
                string fileToBeProcessed = processedFiles.Where(x => x.Value == "Added").Select(x => x.Key).SingleOrDefault();
                processedFiles[fileToBeProcessed] = "Processing";

                bool g = BatchProcessFiles(fileToBeProcessed); //Here i am working on the processing of batch

                if(g == true)
                    processedFiles[fileToBeProcessed] = "Completed";
                else
                    processedFiles[fileToBeProcessed] = "Error";


}

它在大多数情况下都能正常工作。任何实例都会将新的批次 ID 推送到状态为 "Added".

的字典中

它会接受任何 "Added" 的 id 并将其标记为 "Processed" 并开始处理它。

我遇到的问题是这样的:

如果有两个或多个实例同时在字典中读取相同的 id,它们都会找到它的值 "Added",并且它们都会选择它。最终一个会成功处理该批次,但其他实例将找不到该批次并会出错。

有什么类似锁的东西可以在我每次读写字典时实现吗?

如我的评论所述,如果您使用多线程并使用字典,您将在 C# 中遇到问题。

这是因为字典不是线程安全的数据结构。

相反,您应该使用 ConcurrentDictionary

如果这就是你要找的,我建议你看看这个 post

希望对您有所帮助。