我在處理引發它的其他線程上的事件時遇到問題。但是,處理事件的對象不是UI對象,所以我不能使用Invoke執行委託並自動切換到用於事件處理的UI線程。非UI對象上的跨線程事件處理
的情況如下:我有一個包含多種形式MDI應用程序。每個表單都有自己的控制器類,用於處理耦合表單和外部對象之間的通信。所有表格都是概覽或詳細表格(例如ContactsOverview & ContactDetail)並共享相同的數據。
在發生錯誤的形式出現在類似於嚮導的序列的情況下,說詳細信息表單之後的概述表格。在下面的概覽表格中使用的詳細表格數據發生了變化,在切換到概覽表格之前,需要在這些表格中反映出這些變化。從詳細信息表單中引發事件,並由控制器爲完成必要的UI元素更新的概覽表單處理。
現在詳表的更改數據的保存可能需要一段時間,因此是必要的UI會保持應用程序的響應和其他部分仍可使用。這就是後臺工作者開始處理這個問題的原因。數據保存後,事件在後臺線程中引發。概述的控制器處理這個,但是當UI需要更新時,當然存在跨線程異常。
所以我需要的是一種方法來提高UI線程上的事件,但由於處理不UI元素上發生的沒有辦法來自動切換使用調用線程。
從網絡上搜索,我發現這是使用生產者/消費者模式的一個可能的解決方案。但是,據我所知,這需要每個控制器在單獨的線程中監聽一系列事件。由於它是一個MDI應用程序,理論上可以有任何形式的控制器,我不想啓動那麼多的線程。
歡迎任何建議。如果有一種方法可以避免使用背景工作者,那麼這也是一個合適的解決方案。
感謝您的閱讀,
凱文
謝謝,我會研究它。 – kwe 2010-03-10 09:48:35
正是我想建議... – 2010-03-10 09:48:39
在閱讀這篇有用的文章 - http://msmvps.com/blogs/manoj/archive/2005/11/03/74120.aspx - 我很確定這種方法將能夠解決我的問題。根據我的理解,您可以使用SynchronizationContext來保存對調用線程的引用,並且在後臺線程中的處理完成後,可以使用SynchronizationContext中的引用在調用線程上啓動事件。我已經在一個快速演示項目中測試過它,它可以工作。再次感謝! – kwe 2010-03-10 10:31:20