【发布时间】:2017-08-26 19:37:42
【问题描述】:
我正在使用 Websockets 在我的画布上绘制数据:
webSocket.OnMessage += (sender, e) =>
{
String websocketData = e.Data.Substring(3);
WebSocketDataStructure jsonData = JsonConvert.DeserializeObject<WebSocketDataStructure>(websocketData);
// Give control back to main thread for drawing
Application.Current.Dispatcher.BeginInvoke(
DispatcherPriority.Background,
new Action(() => this.updateCanvas(jsonData)));
};
private void updateCanvas(WebSocketDataStructure myData)
{
CanvasUtils.DrawLine(MyCanvas, colorNormalBrush, myData.hsLine.x1, myData.hsLine.y1, myData.hsLine.x2, myData.hsLine.y2);
}
当我每秒收到多条消息时,应用程序开始滞后。我读到使用 Dispatcher.BeginInvoke() 不利于处理频繁的数据,因为我们每次都会立即切换回 UI 线程。
有没有更好的方法来实现这一点?我考虑过创建一个计时器并每隔一秒更新一次 UI 线程。这可以通过将 websocket 数据存储在列表中,并在 UI 线程 (https://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem) 上处理它来工作。这种方法的唯一问题是,我无法在 UI 线程上使用 Thread.Sleep(1000) 设置无限循环。
【问题讨论】:
标签: c# wpf multithreading canvas websocket