【发布时间】:2010-03-10 09:32:54
【问题描述】:
我在处理与引发事件的不同线程上的事件时遇到问题。但是,处理事件的对象不是 UI 对象,所以我不能使用 Invoke 来执行委托并自动切换到 UI 线程进行事件处理。
情况如下:我有一个包含多个表单的 MDI 应用程序。每个表单都有自己的控制器类,用于处理耦合表单和外部对象之间的通信。所有表单都是概览或详细表单(例如 ContactsOverview 和 ContactDetail)并共享相同的数据。
在发生错误的情况下,表单以类似向导的顺序出现,例如详细表单后跟概览表单。在以下概览表单中使用的详细表单数据发生更改,在切换到概览表单之前,这些更改需要在此处反映。一个事件从详细表单中引发,并由概览表单的控制器处理,该概览表单执行必要的 UI 元素更新。
现在,在详细信息表单中保存更改的数据可能需要一段时间,因此 UI 必须保持响应,并且应用程序的其他部分仍然可以使用。这就是开始后台工作人员处理此问题的原因。保存数据时,会在后台线程上引发事件。概览的控制器会处理这个问题,但是当 UI 需要更新时,当然会有跨线程异常。
所以我需要一种在 UI 线程上引发事件的方法,但由于处理不会发生在 UI 元素上,因此无法使用 Invoke 自动切换线程。
通过网络搜索,我找到了一种可能的解决方案,即使用生产者/消费者模式。但据我所知,这将要求每个控制器在单独的线程中侦听事件队列。由于它是一个 MDI 应用程序,理论上可以有任意数量的带有控制器的表单,我不想启动那么多线程。
欢迎提出任何建议。如果有办法避免一起使用 backgroundworker,那也是一个合适的解决方案。
感谢阅读,
凯文
【问题讨论】:
标签: c# multithreading