2011-07-11 93 views
4

環境: 3個Web服務2在同一個池中1在不同的應用程序池中。我真的鎖定了這個東西

它們都具有相同的代碼,試圖訪問非線程安全的東西,比如他們寫入的文件。

我嘗試以相同的方式爲每個Web服務鎖定此代碼。我不確定鎖關鍵字是否正在做我想要的。

一個鎖我嘗試這是在每個Web服務:

string stringValue 
lock (stringValue) 

的其他鎖定安排我嘗試是:

lock (typeof(MyWebServiceClass)) 

將這些鎖防止同時寫入文件,而它在使用?在這種情況下,有多個客戶端擊中每個這些Web服務。

+0

是Web服務的單一服務器上所有正在運行的? – mbeckish

回答

10

你需要一個名爲Mutex跨應用程序池/進程鎖定:

的C#lock關鍵字是語法糖Monitor.Enter()Monitor.Exit()方法在try/finally塊調用。 Monitor是用於進程內鎖定的輕量級(完全託管)同步原語。

在另一方面,一個Mutex可以是本地或全局(跨在同一臺機器上的進程) - 全球互斥,也被稱爲命名互斥,在整個操作系統可見,且可用於線程同步多個應用程序域或進程。另見MSDN

2

我認爲您需要使用Mutex來鎖定AppDomains。

此外,爲了它的價值,避免鎖定類型。如果其他地方的代碼在獲得第一個鎖之後嘗試鎖定,則通常會導致死鎖。最好鎖定一個只能用作鎖的對象。

例如:

object padlock; 

lock(padlock) 
{ 
    // work here 
} 
相關問題