如何在后台任务上创建路径几何图形



我有一个WPF应用程序,我在屏幕上画了一个线条形状。我为此使用了一个 PathGeometry,我在代码 (C#( 中设置了它。一切都很好,但是路径的构造相对昂贵,并且给我的UI带来了一些问题。因此,我尝试在后台任务中创建路径,但事实证明这是不可能的。类有一个 DependencyProperty 成员,看起来只能在 UI 线程上运行。是否可以在后台任务上计算路径?

我正在事件处理程序上尝试这样的事情

    ...
    MyPath = await Task<PathGeometry>.Run( () => GeneratePath());
    ...

这里MyPath是我的类中的一个属性,它与我的 UI 数据绑定。当我运行代码时,我得到一个异常Must create DependencySource on same Thread as the DependencyObject.起初,我认为 MyPath 的设置不知何故没有发生在 UI 线程上,但后来我发现返回的 PathGeometry 包含异常。

PathGeometry派生自Freezable,因此支持冻结后的跨线程访问。

你可以像这样冻结它:

MyPath = await Task.Run(() =>
{
    var path = GeneratePath();
    path.Freeze();
    return path;
});

或者最好在 GeneratePath 方法中调用 Freeze:

private PathGeometry GeneratePath()
{
    var path = new PathGeometry();
    ...
    path.Freeze();
    return path;
}
...
MyPath = await Task.Run(() => GeneratePath());
最简单的

方法是更改 GeneratePath(( 方法以返回字符串(路径的数据值(,然后在异步方法返回后使用 Geometry.Parse() 将其转换为 UI 对象。

相关内容

  • 没有找到相关文章

最新更新