2012-07-30 79 views
1

我試圖用Alchemy Websockets在其示例中使用ConcurrentDictionary集合將一個快速小程序放在一起。添加到ConcurrentDictionary中的項立即進入殭屍狀態

在我寫的代碼中,我試圖向ConcurrentDictionary添加一個新的客戶端。當我試圖訪問這個客戶端時,我發現我的腳本在其他方面失敗了,並且縮小到我添加到ConcurrentDictionary中的項目立即進入「殭屍」狀態。

下面是測試代碼,我添加客戶端:

Client test = new Client(ctx, sessId); 
Clients.TryAdd(test, String.Empty); 
Console.WriteLine ("Adding new client: " + sessId); 

如果用我的調試器在這方面的突破,我可以看到「測試」包含正確的客戶信息,但將它添加到後立即它表示「對象處於殭屍狀態(來自HRESULT的異常:0x8013134F)」。

字典聲明在我的課這樣:

protected ConcurrentDictionary<Client, string> Clients = new ConcurrentDictionary<Client, string>(); 

我知道我可能做一些愚蠢明顯,但怎麼辦?

+2

根據[Mono bugzilla中的錯誤](https://bugzilla.xamarin.com/show_bug.cgi?id=5361),這可能只是調試器窗口中的錯誤。你確定這實際上是對你造成問題嗎? – svick 2012-07-30 15:49:32

+0

我很確定這是造成問題的原因。我最初發現這個問題時,即使當我知道它必須是真實的時候,我建立的條件總是等於假。打破比較顯示了我的一個比較變量中的正確字符串,另一端是我的ConcurrentDictionary的成員,並帶有上述問題。當我Console.WriteLine()應該包含我的數據的殭屍對象,它只是輸出一個空行,所以我認爲這是證據它不是調試器的錯誤。 – DWilliams 2012-07-30 16:02:00

+1

好的,在這種情況下,你可以發佈簡短但完整的示例程序來顯示這個問題嗎? – svick 2012-07-30 16:05:34

回答

2

如果您的結論是進入ConcurrentDictionary的項目進入殭屍狀態,那麼您認爲任何對象都會這樣做,對吧?然後,嘗試通過編寫一個較小的程序,簡化的測試用例,不耦合到客戶端類或WebSockets庫來測試該假設。

如果這仍然給你的問題,恭喜,你現在正在縮小這個問題。然後我會做的第二步是把你的小程序,並嘗試在MS.NET(而不是單聲道)內執行它。如果它在MS.NET而不是Mono中運行,那麼我會在Mono的bug追蹤器中提出一個錯誤:http://bugzilla.xamarin.com/

但是,如果您的程序在MS.NET中不起作用,那麼您可能會做錯某些事情!

+1

原來你們是對的。我在代碼的其他地方發現了這個問題。我試着做一個單獨的項目來測試它,並且確實看起來每個添加到任何ConcurrentDictionary的對象都顯示爲MonoDevelop中的殭屍對象,即使它非常好。 – DWilliams 2012-07-31 11:32:11