2013-12-08 99 views
0

我的客戶機/服務器解決方案中有多個啓動項目。服務器是一個控制檯應用程序,客戶端是一個WinForms應用程序。服務器/控制檯首先啓動以防重要。打破Visual Studio中多個啓動項目之間的死鎖

現在由於某些同步客戶端代碼阻塞服務器而導致死鎖。線程同步使用簡單的lock語句完成。

當發生死鎖時,兩個應用程序當然都會凍結,並且在VS中暫停/暫停只會中斷服務器應用程序,而不會破壞客戶端。這裏有兩個問題:

  • 我該如何選擇哪個項目打破多個啓動項目?
  • 如果一個lock語句卡在死鎖中,有沒有辦法找出哪一行代碼在該對象上有一個當前鎖?

回答

1

我認爲你最好的解決方案是在Visual Studio的單獨實例中調試你的客戶端和服務器,並相應地設置啓動項目。

至於第二個問題,我通常在創建和釋放鎖的時候設置一個guid和輸出。看看這是否發生。如果是這樣,我設置了斷點和調試,並查看堆棧以查看調用的來源。您可能能夠輸出System.Environment.StackTrace到日誌以獲取此信息,但我曾嘗試過。

1

您可以使用2個視覺工作室。一個啓動控制檯,一個啓動服務器

我會檢查你是否真的需要一個鎖定語句。

你想鎖定什麼? 你是否總是需要獨佔鎖?

還是有一些操作可以並行發生,只有一些是獨佔的?您可以使用ReaderWriterLockSlim 這可以降低死鎖的風險。

相關問題