2014-01-06 77 views
0

我有一種情況,我正在處理線程中的一些數據,最初從一個事件觸發,但它需要等到事件發生在主線程繼續之前 - 問題在那裏可能有任何數量的這些併發運行。真正的基本示例:等待事件從主線程觸發後臺線程產生它

事件觸發 - >方法設置爲在其自己的線程後臺運行 - >使用主線程的發送數據方法發送數據 - >等待接收該數據的ACK - >設置主線程上的WaitHandle - >工作線程將發送下一組數據 - >重複 - >退出線程,當所有數據已經​​發送並確認時。

目前我有一個AutoResetEvent在每次ACK進入時都被設置 - 而且正在運行的工作線程將監聽這個 - 但是如果碰巧有10個同時運行的這些工作線程,並且它們都是聽它 - 它擊敗了目的。

我需要產生工作線程,並讓它監聽(WaitOne),以便設置/重置一個特定的WaitHandle,並且繼續僅基於此。

什麼是完成這樣的事情的最佳方法?以某種方式創建一個WaitHandles數組並讓工作線程監聽其索引的AutoResetEvent?

+0

「以某種方式創建一個WaitHandles數組並讓工作線程偵聽其索引的AutoResetEvent? 「 - 是的:-) –

回答

0

我不確定您的線程和您的其他進程正在進行交互的確切方式,但之前使用的模式是字典,其中手動或自動重置事件是值,並且您設置了某種類型的ID作爲關鍵,例如事件,事件發送者,用戶ID等等。

通過這種方式,您可以搜索字典中的相關ID(使用默認索引器),然後等待句柄。如果您需要異步添加等待句柄(例如,在引發事件時),您可能需要使用ConcurrentDictionary類。我不完全確定你需要什麼,但是如果你需要等待所有事件完成,然後再完成一些操作,你還可以查看一個隊列。

注意跨線程同步。您不想在GUI應用程序中阻止您的主線程,並且無法從同一線程編輯GUI

+0

ConcurrentDictionary對於這個應用程序來說太棒了。每次客戶端進入需要確認消息的模式時,我都會對它執行一次TryAdd(ConcurrentDictionary ()),然後在每個消息進來時爲該特定客戶端進行設置 - 在worker線程我只是等待該鍵的WaitHandle。好的解決方案 – MikeyVindictive

0

我認爲你在抽象中挖掘的過於低級。是否有理由不能使用一個或兩個隊列更典型的生產者 - 消費者模型來處理空中請求和響應?當你不試圖重新創建低級別的同步原語時,它會更容易得到它。

+0

通常我會讓每個客戶端連接到它自己的偵聽器(TCP/IP套接字)線程,並簡單地在該特定客戶端的偵聽器中註冊事件。在這種情況下,我在所有客戶端的單個線程上使用異步服務器/偵聽器 - 因此,將偵聽器中的單個事件與特定客戶端綁定的方式並不是很好。聽起來令人困惑,但現在這件事讓我感到困惑。 – MikeyVindictive