2010-07-21 54 views
1

作爲新用戶界面的使用線程等,我能問的是以下簡單的設計似乎沒問題。請參閱來圖image at link here這是線程/後臺工作者設計的C#WPF應用程序好嗎?

特別是:

一)使用的BackgroundWorker的& BackgroundWorker的ProgressChanged有一個單獨的線程的聚合工作。所以我需要一個自定義類/類型,它擁有我需要從聚合器線程傳回我假設的UI線程的所有數據。

b)在聚合器中創建一個單獨的線程,以確保SharpPCap/WinPCap回調方法位於不同的線程中。所以這個Capture Manager線程將數據包結果寫入共享緩衝區。我在這裏假設如果代碼可以看到它們都可以訪問它的緩衝區變量,而不管它們在哪個線程中運行?

感謝

+0

.NET 4是一個選項嗎? – 2010-07-21 01:09:41

+0

是的,這是一個選項 – Greg 2010-07-21 01:25:10

回答

1

我有幾個建議:

  • 我不會建議使用一個BackgroundWorker和ProgressChanged這一點。鑑於你想每1秒鐘「輪詢和聚合」,我建議只使用一個計時器(可能是一個DispatcherTimer)。如果您在單獨的線程中運行(如果需要,也可以使用基於UI線程的計時器),您可以使用Dispatcher.BeginInvoke將調用重新編組回UI線程。

  • 我建議使用ConcurrentQueue<T>來保存你的分組數據,而不是一個列表。這會阻止您在列表中鎖定。如果您必須堅持版本的.NET < 4,您可以使用List<T>,但您需要同步對它的訪問(鎖定某個對象以保護列表中的讀/寫操作)。只要線程安全或正確同步,兩個線程都可以使用相同的集合。

  • +0

    Tks。 Re 1)聚合器是否需要知道UI?如果我想將它重用於其他用戶界面,您會在這裏推薦什麼?某種事件方法? – Greg 2010-07-21 01:29:13

    +0

    我同意大部分裏德的評論,除了我會建議使用'System.Timers.Timer'進行輪詢,並使用調度到TaskScheduler.FromCurrentSynchronizationContext的Task來將調用封送回UI線程。這具有非WPF特有的優點。 – 2010-07-21 01:30:26

    +0

    我仍然很看到Dispatcher的BackgroundWorker優勢嗎?在我的情況下,主要原因是爲什麼我應該使用它在BackgroundWorker上運行,作爲將更新恢復到UI層的機制? – Greg 2010-07-21 02:10:38

    相關問題