2017-08-26 13 views
2

パフォーマンスの問題が発生します。 Dispatcher.BeginInvoke()を使用して頻繁なデータを処理するのは悪いことを読んでいます。なぜなら私たちはすぐに毎回UIスレッドに戻るからです。Dispatcher.InvokeはWPFキャンバスを更新するためには、私は私のキャンバス上のデータを描画するためのWebSocketを使用しています

これを実装するより良い方法はありますか?私はタイマーを作成し、毎秒UIスレッドを更新することを考えました。これは、WebSocketデータをListに格納し、UIスレッド(https://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem)で処理することで機能します。このアプローチの私の唯一の問題は、UIスレッドでThread.Sleep(1000)を使用して無限ループを設定できないことでした。

答えて

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(); 
+0

これは私が欲しかったものです。ありがとう! – Beric

関連する問題