繁体   English   中英

如何在不阻止UI线程的情况下在UI上更新画布?

[英]How can I update a canvas on the UI without blocking the UI thread?

我在ac#wpf应用程序中使用开源图形库oxyplot。 我遇到了一个问题,即在更新图形画布对象时会阻止UI线程。 由于画布对象属于UI线程,因此更新是在UI线程上完成的。

我已经移动了所有可以在后台线程上运行的代码,但是实际绘制画布并不容易。

库的作者使用UI线程的同步上下文中的调度程序尝试了这段代码,但是在写入画布时仍然无法解决UI线程阻塞的问题。

上面的示例确实像绘图库一样工作,因此在此我将不提供任何代码。

我如何在不阻止UI线程的情况下实现这一点?

编辑:

这是我的代码的一部分-它显示了我如何尝试实现这一点。 您可以看到我在代码的第一部分中创建了路径数据。 完成后,我尝试在UI线程上循环这些并将它们添加到画布。 但是,一旦传递到我的Add(p)调用中,我会得到该对象属于另一个线程的错误-即使我将pa.ToList()传递到addToCanvas调用中...

        .........
            pa.Add(path);
        }

        Application.Current.Dispatcher.Invoke((Action)(() =>
            {
                addToCanvas(pa.ToList());
            }));
    }

    public void addToCanvas(List<Path> path)
    {
        foreach (Path p in path)
        {
            Add(p);
        }
    }

我认为您必须在这里使用一些技巧,例如双重缓冲-创建一个缓冲区(字节,位图等)并将其绘制到单独的线程中,然后将绘制的内容放入控件中

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM