【发布时间】:2009-11-15 23:30:43
【问题描述】:
我只是对多线程有点熟悉,因为我读过它,但从未在实践中使用过它。
我有一个使用第三方库的项目,该库通过引发事件来共享输入设备的状态。问题是,编写库的方式是,这些事件是从不同的线程引发的。
我的应用程序不需要是多线程的,但我遇到了很多经典的线程问题(UI 控件抱怨从不同的线程进行交互,集合被修改为一段代码正在迭代它等等)。
我只想将第 3 方库的事件返回给我的 UI 线程。具体来说,我认为应该发生的是:
我的班级接收到事件并且处理程序正在与 UI 不同的线程上运行。我想检测这种情况(如使用 InvokeRequired),然后执行与 BeginInvoke 等效的操作以将控制权交还给 UI 线程。然后可以在类层次结构上发送适当的通知,并且我的所有数据只被一个线程触及。
问题是,接收这些输入事件的类不是从 Control 派生的,因此没有 InvokeRequired 或 BeginInvoke。这样做的原因是我试图干净地分离 UI 和底层逻辑。该类仍在 UI 线程上运行,只是类本身没有任何 UI。
现在我通过破坏这种分离来解决问题。我传入了对控件的引用,该控件将显示我的类中的数据并使用 its Invoke 方法。这似乎违背了将它们分开的全部目的,因为现在底层类直接依赖于我的特定 UI 类。
也许有一种方法可以保存对运行构造函数的线程的引用,然后在 Threading 命名空间中执行 Invoke 命令?
有没有办法解决这个问题?我的方法完全错误吗?
【问题讨论】:
标签: c# multithreading invoke