线程与界面
内核在 IO 线程和线程池上工作,不会假定你使用 WinForms 还是 WPF。
DataReceived和StateChanged可能在非 UI 线程触发。- 更新控件前必须切换到 UI 线程。请使用适配器,而不是在每个窗口里手写
Invoke。 - 不要在事件回调里做长时间阻塞,以免耽误接收。
| 程序集 | 线程切换 | 常用 API |
|---|---|---|
Zeus.Presentation.WinForms | Control.BeginInvoke | AttachZeus、BindText、BindEnabled |
Zeus.Presentation.Wpf | Dispatcher.BeginInvoke | AttachZeus、WpfUiDispatcher、MVVM 绑定源 |
Zeus.Presentation.Abstractions | IUiDispatcher | 测试可用 ImmediateUiDispatcher |
内核和 Zeus.Presentation.Abstractions 不引用桌面框架。
点表内核只提供 Changed 和 BatchChanged,不引用任何界面框架。几个点订 Changed;整表、总貌、趋势落盘订 BatchChanged。AsTableBindingSource 在 Zeus.Presentation.Abstractions 里,只是把 BatchChanged 做成可绑定列表,给 WinForms / WPF 用;控制台和服务直接订事件。怎么选见 点表与采集。
如果必须自己订阅事件,WinForms 使用 BeginInvoke,WPF 在 ViewModel 中使用 WpfUiDispatcher.Current() 或自己的 IUiDispatcher。窗口关闭后不要再改控件。