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