關於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住的內容,所以寫代碼需要我們更認真。倒底是用哪個比較好,就看各位自己的實際需求了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM