【问题标题】:Dispatcher.Invoke to update WPF canvas causes performance problemsDispatcher.Invoke 更新 WPF 画布导致性能问题
【发布时间】: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


    【解决方案1】:

    您可以将高频数据排队并以较低的速度从数据队列中读取项目。通过使用 DispatcherTimer,您可以避免直接调用 Dispatcher。

    var queue = new ConcurrentQueue<WebSocketDataStructure>();
    
    webSocket.OnMessage += (s, e) =>
    {
        var websocketData = e.Data.Substring(3);
        var jsonData = JsonConvert.DeserializeObject<WebSocketDataStructure>(websocketData);
    
        queue.Enqueue(jsonData);
    };
    
    var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
    
    timer.Tick += (s, e) =>
    {
        WebSocketDataStructure data;
    
        while (queue.TryDequeue(out data))
        {
            CanvasUtils.DrawLine(MyCanvas, colorNormalBrush,
                data.hsLine.x1, data.hsLine.y1, data.hsLine.x2, data.hsLine.y2);
        }
    };
    
    timer.Start();
    

    【讨论】:

    • 这正是我想要的。谢谢!
    猜你喜欢
    • 2014-08-02
    • 1970-01-01
    • 2011-06-24
    • 2019-05-08
    • 1970-01-01
    • 2019-05-04
    • 2011-08-08
    • 1970-01-01
    • 2017-12-10
    相关资源
    最近更新 更多