我有一个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 对象。