我在处理引发它的其他线程上的事件时遇到问题。但是,处理事件的对象不是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