0

我在 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);
        }
    }
4

1 回答 1

1

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

于 2013-11-12T09:55:24.747 回答