我正在使用c#.net
我的控制器中有一个POST方法,客户端很快就会调用它。此方法由MVC特性并发运行。
[HttpPost]
public IActionResult PostDog(){
AddDog(TempData, new Dog());
return Json("success");
}
该方法调用另一个需要具有关键部分的方法。
public bool AddDog(ITempDataDictionary tempData, dog){
/* critical section */
List<Dog> dogs = (List<Dog>)(tempData["myDogList"];
dogs.Add(dog);
tempData["myDogList"] = dogs;
/* end critical section */
return true;
}
如果关键部分并行运行,将导致数据丢失。
有没有一种方法可以使用这种MVC结构来实现关键部分?
*edit-说明为什么Post方法可以同时运行:
方法
PostDog
可以同时运行,因为如果客户端以非常快的速度多次提交表单或其他内容(例如每秒10次),则服务器将并行处理这些Post请求,而不是让最后一个请求等待启动,直到之前的所有请求都完成。
*编辑2
看起来使用锁解决了我的并发问题,但TempData似乎没有得到更新。也许这与TempData如何传递到有关
AddDog
。。。
private static readonly object TempDataLock = new();
public static bool AddDog(ITempDataDictionary tempData, dog){
lock(TempDataLock )
{
/* critical section */
List<Dog> dogs = (List<Dog>)(tempData["myDogList"];
dogs.Add(dog);
tempData["myDogList"] = dogs;
/* end critical section */
}
return true;
}