关于Application.Lock和Lock(obj)
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住的內容,所以寫代碼需要我們更認真。倒底是用哪個比較好,就看各位自己的實際需求了。
?
轉載于:https://www.cnblogs.com/lxboy2009/p/5579656.html
總結
以上是生活随笔為你收集整理的关于Application.Lock和Lock(obj)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL从5.5升级到5.6,TIME
- 下一篇: VMware里装XP 没有找到硬盘驱动器