0

在我正在构建的 .NET Core asp.net Web 应用程序中,任务是在请求中启动的;在某些情况下,我们希望在另一个请求中等待此任务的完成。

为此,我放置了一个静态字典来存储对这些任务的引用:

 public static volatile Dictionary<int, Task> MyTasks = new Dictionary<int, Task>();

如有必要,等待来自不同请求的正在运行的任务:

 public static async Task GenerateMyData(int itemId, SomeOtherData data)
 {
     var curTask = MyTasks.Get(itemId); //<- extension method wrapper for TryGetValue
     if (curTask != null && !curTask.IsCompleted)
     {
         await curTask;
     }

     var newTask = Task.Run(async () =>
     {
          AddPrimaryData(itemId, data);
          await AddImageData(itemId, data);
          MyTasks[itemId] = null;
     });

     MyTasks[itemId] = newTask;

}

虽然它在我的开发环境中以及在轻负载下作为 web 应用程序工作,但我对 async/await 的了解越多,我就越不确定它是否会在较重的负载下按预期运行。这种方法对于 asp.net core 2.1 Web 应用程序似乎是安全的吗?

4

1 回答 1

2

最好使用线程安全的ConcurrentDictionary<TKey,TValue> 类。单独制作经典集合volatile并不能使其成为线程安全的。您必须将所有操作包含在一个lock语句中。

ConcurrentDictionary<TKey,TValue> Class您使用 ( )添加项目

bool success = dict.TryAdd(itemId, data);

并检索它们

bool success = dict.TryGetValue(itemId, out data);

还有类似TryRemove和的方法TryUpdate

于 2019-08-06T16:53:30.793 回答