2011-04-01 71 views
1

我有配置這樣的WCF服務:WCF服務完全鎖定

InstanceContextMode = InstanceContextMode.PerCall, 
ConcurrencyMode = ConcurrencyMode.Multiple 

我在哪裏調用服務大約每秒十次約30秒的方法。隨機地,服務停止工作,客戶端停止在調用該服務的線路上。

在服務器端,我有一個靜態對象「MyStaticObject」(未在我的服務中聲明,這是服務器上的其他類)。該對象是一個包含一些實例化對象的詞典,其中有一個背景工作者。

我不認爲數據庫中存在死鎖,因爲它在我嘗試訪問服務時被鎖定,而不是在我嘗試訪問數據庫時。

目前我鎖我dictionnary這樣:

lock (MyClass.MyStaticLockObject) 
{ 
    MyClass.MyStaticObject...; 
} 

我想知道什麼可能導致這種怪異的行爲。

+0

在半分鐘內300次?爲什麼??? – Patrick 2011-04-01 19:04:27

+0

是否從多個線程訪問「MyStaticObject」? – 2011-04-01 19:06:23

+0

@帕特里克:推測是負載測試。如果這是網絡服務的一部分,如果知道它可以採取懲罰,那將是很好的。 – 2011-04-01 19:07:07

回答

2

如果您在客戶端爲每個操作創建一個新的代理對象,我已經看到WCF服務在高負載下鎖定。你確定你沒有每秒創建10個代理實例嗎?

如果您正在訪問詞典的靜態實例,你可能要考慮鎖定它,當你這樣做的讀/寫操作,例如:

lock (MyStaticObject) 
    MyStaticObject.Add("Foo", foo); 

lock (MyStaticObject) 
    foo = MyStaticObject["Foo"]; 

或者,你可以嘗試使用一個線程安全字典的實現,如this article中的字典,它使用ReaderWriterLockSlim維護用於讀寫的單獨鎖。順便說一句:對於那些不敢相信服務將被稱爲每秒10次的項目,我目前正在開展一個項目,該項目每秒可以完成100次呼叫 - 而且不得不將其部署到哪裏。

+0

謝謝你的回覆。我鎖定了我的MyStaticObject,請看我的第一篇文章,看看我是如何進行的。每次我打電話給服務時,我都沒有創建代理,我只打開一次,直到應用程序關閉纔打開。 – 2011-04-01 19:37:01