ASP.NET MVC Lock锁的测试

思路:我们让后台Thread.Sleep一段时间,来模拟一个耗时操作,而这个时间可以由前台提供。

我们开启两个或以上的页面,第一个耗时5秒(提交5000),第二个耗时1秒(提交1000)。

期望的测试结果:

不加Lock锁,第二个页面会先执行完,因为耗时短(1秒)。

加了Lock锁,第二个页面会一直等待,直到第一个页面执行完成后再进行。

后台:

cs 复制代码
    public class DBController : Controller
    {
        /// <summary>
        /// 显示页面
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public IActionResult Concurrency()
        {
            return View();
        }

        /// <summary>
        /// 模拟耗时操作
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult ConcurrencySubmit(string msec)
        {
            if (!string.IsNullOrEmpty(msec))
            {
                 System.Threading.Thread.Sleep(int.Parse(msec));
                 LogHelper.Info("submit:" + msec);
            }

            return View("Concurrency");
        }
    }

前台页面 Concurrency.cshtml:

html 复制代码
@using(Html.BeginForm("ConcurrencySubmit", "DB", FormMethod.Post))
{
@Html.TextBox("msec",1000)
<button>提交</button>
}

然后开两个页面,第一个5秒,第二个1秒,同时提交。

发现第二个页面先执行完毕了,因为耗时最短。

接下来我们使用Lock来进行防并发处理,修改后台代码:

cs 复制代码
    public class DBController : Controller
    {
        private static object locker = new object();
        
        /// <summary>
        /// 显示页面
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public IActionResult Concurrency()
        {
            return View();
        }
        
        /// <summary>
        /// 模拟耗时操作
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult ConcurrencySubmit(string msec)
        {
            lock (locker)
            {
                if (!string.IsNullOrEmpty(msec))
                {
                    System.Threading.Thread.Sleep(int.Parse(msec));
                    LogHelper.Info("submit:" + msec);
                }
            }

            return View("Concurrency");
        }
    }

同样的方法,再次提交。这次会发现第二个页面会等待,直到第一个页面执行完成后才执行

相关推荐
QQ_216962909614 小时前
基于C#(Asp.net)电竞陪玩信息管理系统的设计与实现
java·大数据·spring boot·微信小程序·c#·云计算·asp.net
wdfk_prog2 天前
Wi-Fi Direct 源码分析(11):P2P-GROUP-STARTED 之后——Group Interface、IP 配置与真实数据通路
运维·服务器·网络协议·tcp/ip·asp.net·p2p·wifi-direct
wdfk_prog3 天前
Wi-Fi Direct 源码分析(09):从 P2P_CONNECT 到 GO Negotiation 完成
运维·服务器·ubuntu·golang·asp.net·p2p·wifi-direct
迪丽热爱5 天前
HTTP Error 500.30 - ASP.NET Core app failed to start
后端·asp.net
Lost of 程序猿6 天前
建造者模式实战:告别“十参数构造函数“的数据导出任务
后端·设计模式·c#·asp.net
Lost of 程序猿6 天前
命令模式实战:把“下单后的动作“打包成可执行的任务
后端·设计模式·c#·asp.net·命令模式
kybs199113 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
Lost of 程序猿15 天前
用 YARP 为 .NET 微服务搭一座“立交桥“:路由转发与生产配置实践
c#·asp.net
Lost of 程序猿16 天前
用 Quartz.NET 优雅地处理 .NET 定时任务:从选型到 Docker 部署全记录
后端·c#·asp.net
Lost of 程序猿19 天前
.NET 10 船端单机部署与离线升级实战:从闪退事故到无感回滚
c#·asp.net·.net