ASP.NET MVC Lock锁的测试

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

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

期望的测试结果:

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

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

后台:

    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:

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

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

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

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

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

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

相关推荐

  1. 【MySQL】MySQL(二)表与行测试

    2024-07-10 10:52:04       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 10:52:04       99 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 10:52:04       107 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 10:52:04       90 阅读
  4. Python语言-面向对象

    2024-07-10 10:52:04       98 阅读

热门阅读

  1. 单元测试核心类备忘

    2024-07-10 10:52:04       33 阅读
  2. Node.js有什么优点

    2024-07-10 10:52:04       28 阅读
  3. Python爬虫-获取懂车帝“指定车型”的销量数据

    2024-07-10 10:52:04       27 阅读
  4. 深入解析CSS中的!important规则:优先级与最佳实践

    2024-07-10 10:52:04       34 阅读
  5. Django中模型的基于类的混入

    2024-07-10 10:52:04       25 阅读
  6. Impala写Parquet文件

    2024-07-10 10:52:04       27 阅读
  7. C# 反射

    2024-07-10 10:52:04       28 阅读
  8. 在程序中引用cuda.memory函数监控GPU内存

    2024-07-10 10:52:04       32 阅读
  9. LlamaInde相关学习

    2024-07-10 10:52:04       35 阅读