2011-01-19 21 views
2

我需要在c#中編寫一個應用程序,用於跟蹤多個任務,每個任務都被實現爲一個在其自己的線程上運行的類實例。用戶界面將用於顯示每個任務實例的狀態,具體取決於從樹視圖中選擇哪個任務來顯示任務列表。編寫一個多線程C#應用程序

我有一個想法是創建一些其他類,稱爲PropertyClass,它將有一個TaskClass的實例和與此TaskClass實例有關的一些屬性。然後,無論何時TaskClass實例更改其狀態,PropertyClass實例中的相關屬性都會更新,然後當從Tree View列表中選擇任務時,將使用PropertyClass中的這些屬性值更新UI。

可能有數百個正在運行的任務將與遠程機器上的服務進行通信。

我還可以如何以高效的方式編碼此解決方案?

回答

1

我有幾點建議。

首先,您需要一種方法來確保您不會因阻塞您的應用的線程關閉而結束。確保所有線程都是後臺線程的一個可靠的方法是確保所有線程都是後臺線程。如果您必須確保線程的工作在加入或中止前完成,那麼這可能會有點問題。

其次,你可以看看使用ThreadPool類,這應該使創建和使用線程更有效。線程池可以幫助您管理線程。

第三,您需要一種方法來同步從GUI訪問數據到其他線程中的數據。在WPF中使用Dispatcher,在WinForms中使用Invoke。

第四,如果BackgroundWorker類適合您的應用程序的模型,它可以幫助所有這些類。第五,事件和委託可以是BeginInvoked,它基本上把它們放在另一個線程上。這是一種隱含的多線程,可以是有用的。

第六,我還沒有機會使用它,.Net 4有可能對您有用的並行任務庫。

第七,安全共享數據訪問和同步可以使用鎖定和/或監視來完成。

希望這會有所幫助。

-Nate

0

如果每個TaskClass實例對應的樹形圖的一個節點,你可以存儲在樹視圖項的標籤屬性TaskClass實例。或者,您可以創建一個TaskClasses的字典,由一個唯一標識符(例如GUID)作爲鍵,並將標識符存儲在Tag屬性中。

在任何一種情況下,都使用回調方法來指示TaskClass實例有更新。