2014-03-12 67 views
0

我想利用.NET 4.5的新線程功能來設計一個系統來更新內存中的對象列表。多線程服務工程問題

我多年前在Java中使用多線程,我擔心我的技能已經停滯不前,尤其是在.NET領域。

基本上,我寫了一個Feed抽象類,並且從每個線程的繼承。線程類本身很簡單,運行良好。

這些類中的每一個都無休止地運行,它們會阻塞,直到發生事件並更新列表。

所以第一個問題是,在這些線程運行的時候,如何讓父線程保持活着?我通過使用Console.read()將其當前寫入開發控制檯應用程序來阻止這種競爭條件。

其次,我想建立一個我可以從父線程訪問的List對象的存儲庫。我如何從子線程更新這些列表並將它們暴露給另一個系統?試圖避免SQL。共享內存?

我希望我已經說清楚了。我希望這樣的事情:Writing multithreaded methods using async/await in .Net 4.5 除了我們需要外部類的適應性,當然,我們需要以某種方式公開這些列表。

回答

1

你可以用一些標誌運行的,而「父」線程停止它:

while(flag){ 
    //run the thread 
} 

可以公開公共列表一些類的屬性來保存你的數據。請記住在多線程代碼中鎖定訪問權限。

+0

查看具有超時而不是標誌+ Thread.Sleep的'AutoResetEvent'。 – Andrey

0

如果'父'線程在處理過程中應該等待,它可以簡單地調用異步方法(s)到await

如果必須等待特定事件,則可以使用信號對象,例如Barrier

如果線程必須「做」的事情在等待,你可以檢查結果的可用性或進展情況:How to do progress reporting using Async/Await

0

如果您使用的任務,你可以使用Tasks.WaitAll等待任務完成。默認情況下,任務和異步/等待使用您的系統的ThreadPool,所以我會避免放置任何東西,但在這裏相對較短的運行任務。

如果你使用System.Threading.Thread(我更喜歡使用這些長時間運行的線程),請在這裏接受的答案:C# Waiting for multiple threads to finish

如果你能獲取數據的批次,可以公開的服務允許訪問共享對象使用自己託管的Web API或類似NancyFX。如果您更喜歡二進制通信,WCF和遠程處理也是選項。

如果您有很多小事務,則共享內存,保持活動狀態的TCP連接或UDP是選項。也許你可以使用它們提供的C#綁定使用ZeroMQ(它不是傳統的隊列)?

對於併發訪問列表,請在實現自己的鎖定之前查看System.Collections.Concurrent中的類。