我有一些商业设备,可以通过设备制造商提供的 .Net 库连接到这些设备 - 所以我无法控制库或设备,只有我的代码。
制造商已经设置了他们的系统,因此如果您没有通过他们的库连接到设备,那么它可以正常工作。但是,当您确实连接到他们的库时,有一个隐含的要求,即您以设备运行速度设置的速率为 Windows 消息泵提供服务。这是因为他们的库实现了一个事件系统,您可以订阅该事件系统来跟踪设备的操作,但他们假设您的应用程序代码将基于 WinForms。(但在他们的文档中没有明确说明这一点 - 只是他们的所有 2 个 .Net 示例程序都是基于 WinForms 的。)我已经向他们的技术支持确认,期望您将使用 WinForms 应用程序。
就我而言,我正在编写一个基于 C#、非 WinForms 的应用程序(实际上是一个 Windows 服务,所以我没有 UI 线程),即使我正在连接到设备,我也没有订阅任何事件。结果,我发现我需要引用 WinForms 程序集并以足够快的速度调用 Application.DoEvents() 来服务所有我不订阅的事件。
所以我的问题是:
- 在这种情况下,我唯一的选择是调用 Application.DoEvents() 吗?
- 还是有更现代的方法来做到这一点?
- 以 20 毫秒的速率调用 DoEvents() 的后果是什么?
- 不相关,但如果我编写了一个基于 WPF 的应用程序,该程序是否可能为消息泵提供服务?
编辑
我应该补充一点,如果您连接到设备并且不为 windows 消息泵提供服务(即使没有订阅他们的任何事件),那么设备会开始出现不可预测的行为。
编辑 2
此外,我用来连接库的线程也从最初的 Windows 服务线程中删除了大约 2 或 3 代。