2009-07-30 97 views
1

我們有一個運行在不同線程中的多個子系統的應用程序(即一個線程監視GPS,另一個監視RFID閱讀器等)。線程由獨立於win表單部分的服務註冊表啓動和監視。在Win Forms應用程序中處理多個線程的最佳方式

該應用程序的初始版本只有一個表單,它將在更新計時器上運行,並且每秒鐘只檢查每個子系統上的靜態變量的值。

我試圖清理它,因爲我們正在增加額外的表單,而且目前的方法幾乎沒有線程安全性。我希望每個子系統在其基礎狀態發生變化時拋出一個新事件,以便每個表單只能訂閱它所關心的事件,並且我們可以移動到更響應的UI ...我不喜歡更新計時器方法。

因爲在子系統線程中觸發事件,所以我遇到了問題,所以我得到System.InvalidOperationException異常抱怨跨線程調用,當我嘗試更新與事件傳遞的任何狀態的用戶界面。

因此,目前,在閱讀完msdn文檔後,我的選項是對每個我希望更新的字段使用control.invoke,這對於包含大量字段的複雜表單非常惱人,使用後臺工作人員來運行子系統在表單本身中或者仍然在定時器上運行這些表單並查詢子系統本身,這是我試圖避免的。我希望表單儘可能與底層系統分離......他們只應該知道他們關心哪些事件並更新相關字段。

我的問題是,我在這裏錯過了什麼?有沒有更好的方法來構建這個系統,以便子系統可以在自己的線程中運行,但仍然以非耦合的方式發送通知?

任何幫助,將不勝感激

歡呼

nimai

回答

1

而不是調用對您要更新,使用MethodInvoker委託與BeginInvoke和調用,它的方法各領域所有的立即更新。例如...

BeginInvoke(new MethodInvoker(MyUIUpdaterMethodHere)); 
0

你可以看看Event Aggregator模式基本上允許鬆散耦合的pub/sub型基於事件的架構。 Prism是Microsoft Patterns and Practices團隊用WPF和Silverlight構建複合應用程序的框架,具有事件聚合功能,可以讓不同的UI組件以鬆散耦合的方式與您的設計目標類似地相互通信。您可以查看它並嘗試僅使用它的事件聚合部分。如果沒有,您可以訪問源代碼,以便您可以製作符合您要求的內容。

0

你可以使用Windows Forms Synchronization Context來傳遞一個SendOrPostCallBackDelegate(或一個lambda),它又可以以線程安全的方式更新多個控件。

聽起來像這些子系統是作爲一個Windows服務運行。 你的winform應用程序如何與這些子系統進行通信。

相關問題