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");
        }
    }

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

相关推荐
神仙别闹13 小时前
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
前端·后端·asp.net
专注VB编程开发20年4 天前
asp.net mvc如何简化控制器逻辑
后端·asp.net·mvc
前端世界4 天前
ASP.NET ListBox控件多选实战:3步打造高效兴趣收集系统
后端·asp.net
[email protected]5 天前
ASP.NET Core SignalR - 部分客户端消息发送
后端·asp.net·.netcore
邪恶的贝利亚5 天前
从webrtc到janus简介
后端·asp.net·webrtc
不超限6 天前
Asp.net core 使用EntityFrame Work
后端·asp.net
不超限6 天前
Asp.net Core 通过依赖注入的方式获取用户
后端·asp.net
新知图书6 天前
下载和安装Visual Studio(开发ASP.NET MVC应用)
ide·asp.net·visual studio
vvilkim8 天前
ASP.NET Core 中间件深度解析:构建灵活高效的请求处理管道
后端·中间件·asp.net
不超限8 天前
Asp.Net Core基于StackExchange Redis 缓存
redis·缓存·asp.net