2 回答
TA贡献1820条经验 获得超9个赞
您遗漏了一些细节,主要是事件处理程序在 GUI 线程上执行的操作。Invoke 或 BeginInvoke 等。
但如果保护您的数据最重要,还有另一种选择:将新数据推送到 ConcurrentQueue。引发 Received 事件是可以的,但可选,您可能不需要它。
主线程可以在自己的时间清空队列。例如使用定时器。
您的屏幕更新仍然会断断续续,但您不应再丢失数据。
TA贡献2011条经验 获得超2个赞
您必须拆分(线程方式)两件事:后台工作和绘图工作。一般来说,这是如何做这些事情的方式,但要具体 - 如果您的绘图需要时间,那么您的工作线程可能无法按时处理传入的数据,您可能会丢失一些数据/ 省略(这就是您实际观察到的)。
这是一种方法(该方法必须是 UI 类的成员 - 窗口、用户控件等):
void OnDataReceived(object sender, DataEventArgs e)
{
// here we're in the context of the working thread
// this call will return immediately giving control back to the working thread
Dispatcher.BeginInvoke(
DispatcherPriority.Normal,
(Action)delegate
{
// here we are in the context of the UI thread
});
}
- 2 回答
- 0 关注
- 131 浏览
添加回答
举报