ASP.NET MVC 如何使一种方法只能由一个线程同时执行?

Posted

技术标签:

【中文标题】ASP.NET MVC 如何使一种方法只能由一个线程同时执行?【英文标题】:ASP.NET MVC How to make that one method is executed only by one thread simultaneously? 【发布时间】:2020-10-22 19:24:39 【问题描述】:

我有一个从 ActionResults 方法调用的静态方法。静态方法调用更新数据库中的共享数据,所以,我需要静态方法只能被每个请求执行,然后在上一次调用完成之前不能再次执行。

方法是这样的:

    public static class GeneralSettings
    
      
        public static string GetSSCC(string precode, int totalDigitNumber)
        
            //Call to database to update data 
            [...]


            return "something"
        

         
    

有什么想法吗?

谢谢!

【问题讨论】:

docs.microsoft.com/en-us/dotnet/csharp/language-reference/… 查看微软的Overview of synchronization primitives 请注意,除非数据库位于运行代码的同一台机器上并且只有一个应用程序实例在运行,否则您不能依靠代码本身的同步来保证数据的一致性.相反,代码和数据库应该考虑如何使用乐观并发等方法处理多个写入者,并更新代码以适当地处理此类场景:en.wikipedia.org/wiki/Optimistic_concurrency_control 谢谢,我认为这些链接可以指导我 【参考方案1】:

您应该使用锁或监视器来实现线程同步,即一次只允许一个线程访问一个函数/变量。参考以下文章:

Lock Article

c# Lock Article

【讨论】:

谢谢,当共享数据是内存中的变量时,我已经看到了这些方法,但它也可以用于同步调用数据库的方法? 无论你在 lock 中放了什么......另一个线程必须等待第一个线程

以上是关于ASP.NET MVC 如何使一种方法只能由一个线程同时执行?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC实现一个用户只能登录一次

如何从 ASP.NET MVC 控制器方法返回由 JSON.NET 序列化的 camelCase JSON?

ASP.NET MVC实现一个用户只能登录一次 单用户登录

Asp.net mvc和asp.net有啥区别?

如何在 ASP.NET 5 MVC 6 (vNext) 中定义 Identity 的密码规则?

ASP.NET MVC 4 控制器扩展