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

时间:2013-11-12 08:52:24

标签: c# wpf multithreading canvas oxyplot

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

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

库的编写者使用来自UI线程的同步上下文的调度程序尝试了这段code,但在写入画布时仍然无法绕过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);
        }
    }

1 个答案:

答案 0 :(得分:1)

我认为你必须在这里使用一点hack,类似于双缓冲 - 创建一个缓冲区(字节,位图等)并在单独的线程中绘制它,然后将绘制的东西放在控件< / p>