холст не обновляется в режиме реального времени в фоновом потоке - PullRequest
1 голос
/ 06 сентября 2011

В .NET4.0 WPF я хочу отобразить DrawingPath на холсте, используя фоновый поток. Следующий ConsumerJob правильно работает в фоновом режиме и опрашивает очередь точек для рисования. Я использую Dispatcher, чтобы изменить холст в главном потоке, и он корректно отображается. Тем не менее, я ожидаю, что этот код будет отображать каждый сегмент по одному, когда и когда будет вызван каждый children.add (как анимация). Что происходит, так это то, что весь экран отображается сразу, а не по одному сегменту за раз. Как мне изменить код для отображения на экране, когда дети добавляются по одному за раз?

public void ConsumerJob()
    {

        while (true)
        {
            PointsD pt = (PointsD)queue.Consume();
            displayQueue.Enqueue(pt);

            pt = Scale(pt);

            this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                (ThreadStart)delegate()
                {
                    Path drawingPath = new Path();
                    StreamGeometry streamingGeometry = new StreamGeometry();
                    drawingPath.Stroke = Brushes.Black;
                    drawingPath.StrokeThickness = 0.5;

                    using (StreamGeometryContext ctx = streamingGeometry.Open())
                    {
                            ctx.BeginFigure(new Point(pt.x0, pt.y0), false, false);
                            ctx.LineTo(new Point(pt.x1, pt.y1), true, false);
                    }

                    streamingGeometry.Freeze();
                    drawingPath.Data = streamingGeometry;

                    this.Children.Add(drawingPath);

                }
                );

        }

1 Ответ

1 голос
/ 06 сентября 2011

Dispatcher.BeginInvoke является асинхронным, вы пробовали его синхронный аналог Invoke?

Это должно как минимум обеспечить выполнение всех делегатов в очереди в правильном порядке, хотя и не уверен насчет синхронизации.*

Вы также можете попробовать более высокий DispatcherPriority в дополнение к этому.

...