簡體   English   中英

編寫多線程C#應用程序

[英]Writing a Multi-threaded C# application

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

我的想法是創建另一個名為PropertyClass的類,該類將具有TaskClass的實例以及與此TaskClass實例相關的一些屬性。 然后,每當TaskClass實例更改其狀態時,都會更新PropertyClass實例中的相關屬性,然后從Tree View列表中選擇任務時,將使用PropertyClass中的這些屬性值來更新UI。

這些任務可能正在運行數百個,這些任務將與遠程計算機上的服務進行通信。

我還能如何有效地編碼此解決方案?

首先從MSDN上的Task Parallel庫中閱讀此文檔。

我有一些建議。

首先,您需要一種方法來確保不會導致線程阻塞您的應用程序關閉。 一種可靠的解決方法是確保所有線程均為后台線程。 如果必須確保在加入或中止線程之前完成線程的工作,這可能會有些問題。

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

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

第四,如果BackgroundWorker類適合您的應用程序模型,則它可以提供所有幫助。

第五,事件和委托可以被BeginInvoked所使用,這實際上將它們置於另一個線程上。 它是一種隱式多線程,非常有用。

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

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

希望這可以幫助。

-Nate

如果每個TaskClass實例與樹視圖上的一個節點相對應,則可以將TaskClass實例存儲在樹視圖項的Tag屬性中。 或者,您可以創建TaskClasses的詞典,並用諸如GUID之類的唯一標識符作為關鍵字,然后將該標識符存儲在Tag屬性中。

在這兩種情況下,都應使用回調方法來表示TaskClass實例具有更新。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM