关于Application.Lock和Lock(obj)

此文内容由本人与yeagen一起研究,由yeagen总结。yeagen博客园地址:yeagen.cnblogs.com

1.Application.Lock和Application.UnLock一般配对出现,用于锁住Lock与UnLock之间的所有代码(注意不光锁住对于Application的赋值)。

2.Lock(obj) 于用锁住obj对象,obj对象必须是全局对象(如:Application)。

Application.Lock/UnLock的使用方法:

Application.Lock();
//其他代码
Application["value"] = 1;
//其他代码
Application.UnLock();

 Lock(obj)的使用方法:

Lock(Application){
//其他代码
Application["value"] = 1;
//其他代码
}

以上两段代码的功能是一样的,都是锁住代码段让代码段内的代码不会被多线程同时执行。

它们两者之间也存在区别,来看一下它们的区别:

网站内任何一个网页执行Application.Lock的时候,整站中所有关于Application的操作都会被锁定延时执行。(包括:Application赋值和Application读取);而Lock(obj)则不会影响其他没有写Lock(obj)的页面。

例子:

先来看看Application.Lock的用法:

 A页面:

Application.Lock();
Application["value"] = 1;
System.Threading.Thread.Sleep(10000);
Application.UnLock();

 B页面:

object value = Applcation["value"];

我们先执行A页面,再执行B页面。由于Application在A页面中被锁定,所以B页面中需要获取Application中的值则需要等待A页面中执行完毕才行。

我们再来看一下Lock(obj)的用法:

A页面:

lock(Application)
{
Application["value"] = 1;
System.Threading.Thread.Sleep(10000);
}

B页面:

object value = Applcation["value"];
Applcation["value"] = 2;

我们同样先执行A页面,再执行B页面。你会发现A页面中Application虽然被锁定,但是由于在B页面并没有相应Lock代码,读取和修改都是成功的。

如果需要把B页面锁住,则需要把B页面的代码修改成:

lock(Application)//B页面里也要加入Lock
{
object value = Applcation["value"];
Applcation["value"] = 2;
}

 

另外:Application和Lock(Application)虽然都可以锁定Application,但不能互相锁定,即:在A页面中用Application.Lock/UnLock,在B页面中用Lock(Application),这样B页面是锁定不了的,当然如果B页面中本身就包含了对Application的读取和赋值,那么B页面也会被锁,原因是上面已经提到了。

由 此可见:Application.Lock/UnLock比较安全,因为它是全局锁定所有的Application的,而Lock(obj)则更灵活,因 为另一页面中如果没有写Lock(obj)则可以修改其他页面Lock住的内容,所以写代码需要我们更认真。倒底是用哪个比较好,就看各位自己的实际需求了。

posted @   lear  阅读(332)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示