画布不是由后台线程实时更新的

时间:2011-09-06 00:21:33

标签: wpf canvas background rendering

在.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 个答案:

答案 0 :(得分:1)

Dispatcher.BeginInvoke是异步的,您是否尝试过同步对应Invoke

这应该至少强制所有排队的代表以正确的顺序执行,但不确定时间。

您可能还想尝试更高级别的DispatcherPriority。