2017-02-16 81 views
1

我有需要傳達給不同網絡上的主機和喜歡的UI事件,從不同的插座各種網絡消息,定時器,事件反應的軟件項目...並行軟件設計

我的問題是我找不到一個令人滿意的解決方案來確保線程安全,同時仍提供非阻塞方法。我有很多類都依賴彼此,在我的想象中,我看到很多線程運行我的課程的方法不受控制的越野。所以我必須爲所有事情創建鎖。

我想通過添加太多的鎖,我的​​方法幾乎可以像阻塞鎖一樣產生錯誤,併產生像死鎖一樣的錯誤。

我需要使用.NET 3.5,但我很好奇什麼解決這個看起來像任何語言/框架(可能使用的.Net> 3.5將是解決辦法?)

起初我嘗試想象使用Begin ...()方法創建的線程流。所以我的第一個方法是定義一個充滿線程的手來維護我的應用程序的某個部分(例如Network thread,Event thread,...)。這樣,理論上我可以減少對鎖的需求,因爲資源只能綁定到他們唯一的一個線程。因爲那些線程必須關心不同的操作,所以我嘗試實現自己的事件隊列(請參閱How to implement a message pump in Non-UI thread in .NET?),但感覺就像.Net沒有爲此提供至少某種模式,可能會有更好的解決方案這些問題。

我一直在閱讀關於設計模式等的所有MSDN頁面,這有所幫助,但我仍然沒有看到整個圖片。

我認爲這是一般的.Net或併發編程中的常見情況。也許我只是沒有看到在我面前居住的解決方案。如果有的話,如果有人能指引我走向正確的方向,我會很高興。

這是一個複雜的話題,很難解釋。希望我能提供足夠的信息。如果有什麼不清楚的地方,請詢問。

謝謝你的幫助。

+0

只需將您的資源設計爲演員(演員模型)即可。基本上,一個帶有郵箱(隊列)的單線程組件可以接收命令。 – plalx

+0

爲什麼不發佈答案?感謝提示。關於演員模型的維基百科文章類似於我自己的想法。正如我在我的問題中所假設的那樣,類似的方法在.Net中似乎並不常見。雖然有第三方庫,我喜歡這種方法。 –

+0

你需要消息/命令才能持久嗎?例如,如果UI執行一個動作,它是否絕對需要接收一個ACK,以確保即使系統停機,他的命令最終也會得到處理? – plalx

回答

3

我覺得有用的producer/consumer pattern。基本上,您可以擁有不對稱數量的生產者和消費者,例如,您可以讓多個線程提供隊列,並且只有一個線程正在消耗它們;或者多個線程競爭處理隊列中的消息。

How to: Implement a Producer-Consumer Dataflow Pattern

在你的情況下,從插座和UI事件的消息來將數據塊需要進行處理,那麼你可以有一個單獨的線程(在你的情況可能是UI線程)從讀書隊列,並在UI上進行操作。這樣,該線程不需要鎖定所有內容。

+0

不幸的是,我無法(但)upvote。這聽起來很有幫助。看起來很難把所有東西都放入這種模式。但我想整個問題的解決方案不能只是一個模式,而是適用於應用程序不同部分的適當模式/工具。 –

+0

我會將此標記爲答案。也許這給了我更多的信任,所以我可以upvote;)我想我需要變得更加堅定像TPL,併發模型/模式等類似的主題。所以讓我們將其定義爲「精髓」的一部分。謝謝大家。 –