2011-04-26 60 views
4

我有一個ASP.net(c#)應用程序,它有一部分代碼修改全局可訪問的資源(如web.config文件)。當修改資源,自然,爲了防止競爭條件僅允許一個用戶在一個時間,所以我需要使用顯示器來鎖定的代碼:ASP.Net - 監視器/鎖或互斥

鎖(Global.globallyAccessibleStaticObject) { //..modify資源 //..save資源 }

我很滿意這個鎖定的做法,但轉念一想,如果這是什麼還不夠嗎?我應該使用互斥體而不是?我知道互斥對進程間鎖定很有用(跨越許多進程和應用程序),因此速度較慢,但​​考慮到部署的asp.net頁面的性質(跨多個應用程序域同時發出多個請求),這是否有必要?

似乎答案,將取決於ASP頁是如何在服務器端處理。我已經完成了有關http管道,應用程序域,線程池等的研究,但我仍然對是否有必要懇求爲我的同步進行內部進程鎖定或進程內鎖定是否足以用於Web應用程序而感到困惑?

注意:我不想陷入特定的任務,因爲我希望這個問題保持一般,因爲它可能與許多(多線程)場景有關。此外,我知道有更多方法可以完成這些我現在不在乎的任務(異步處理程序/頁面,Web服務等)。

回答

4

如果你的應用程序只在一個應用程序池運行,則在一個物理W3wp.exe進程中運行,因此監視器/鎖應該是足夠的看守共享資源。採用這種策略,您只需要保護在同一進程中運行的線程。

1

我們遇到了工作的情況下,我們有一個IIS應用程序配置爲單一的AppDomain運行,但lock不足以保護對資源的訪問。

我們認爲這是發生的原因是,IIS是回收的AppDomain被釋放鎖之前,並踢了一個新的AppDomain,所以我們得到的衝突。

更改使用Mutex已經(到目前爲止)解決了這個對我們來說。