代码之家  ›  专栏  ›  技术社区  ›  Uuuuuumm

当一个方法被并发方法调用时,我如何同步运行它

  •  0
  • Uuuuuumm  · 技术社区  · 2 年前

    我正在使用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;
    }
    
    0 回复  |  直到 2 年前