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

我一直在使用基于时间的天蓝色函数。
我想在我的函数应用程序中实现批处理的多线程。
Azure函数的实例每10秒创建一次。
我一直在管理一个具有batchId和batchStatus的静态字典(即“已添加”,“已处理”,“失败”)
这是示例代码

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推送到状态为“已添加”的字典中。

它将采用任何“已添加”的ID,并将其标记为“已处理”,并将开始对其进行处理。

我面临的问题是:

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

每次读写字典时,都可以在字典上实现类似锁的功能吗?

参考方案

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

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

相反,您应该使用ConcurrentDictionary

如果这是您要寻找的,我建议您看看这个post

希望对您有帮助。

当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java

我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…

改造正在返回一个空的响应主体 - java

我正在尝试使用Retrofit和Gson解析一些JSON。但是,我得到的响应机构是空的。当我尝试从对象中打印信息时,出现NullPointerException。我确保URL正确,并且我也确保POJO也正确。我正在使用jsonschema2pojo来帮助创建POJO类。这是我要解析的JSON{ "?xml": { "@versi…

json数组,其中in数组返回错误?坏字符串 - javascript

我将json字符串文件解析为python,并且始终返回error。我使用了在线json格式化程序和验证器,它们也返回错误,因此我需要帮助使我的json正确并告诉我错误 [{ "sentence_id": "TR.00001", "sentence": { "text": …

每个文件合并后添加换行 - python

我有很多类似以下内容的JSON文件:例如。1.json{"name": "one", "description": "testDescription...", "comment": ""} test.json{"name"…

Json到php,json_decode返回NULL - php

我正在用PHP进行JSON解析器的一些API,用于存储有关遗产的信息。我在解析时遇到问题,因为它返回的是NULL值而不是数组或对象。简单的JSON代码可以很好地解析,但是可以这样:{"success":true,"totalCount":1,"data":[{"id":99694…