【发布时间】:2013-08-07 17:48:13
【问题描述】:
我有一个程序,用户可以在其中查看保存在 XAML 中的各种 3D 模型,然后使用 TrackballDecorator 操作 Viewport3D。这些 XAML 文件中包含的转换是我使用问题WPF 3D - How can I save and load a Camera view?
的答案中的修改应用于 TrackballDecorator我最近将项目切换到 .net 4.5 框架以利用 XamlReader 类的新异步功能,这与我访问模型保存的转换的方式发生了冲突。
我目前正在做的是:
private Task<TrackballDecorator> loadModel(string path)
{
var tempVP = new XamlReader().LoadAsync(XmlReader.Create(path)) as Viewport3D;
return new TrackballDecorator() { Content = tempVP, Transform = (tempVP.Camera.Transform as Transform3DGroup) };
}
这不起作用,因为 XamlReader 尚未完成加载,因此返回了一个空 Transform。
我想做的是:
private async Task<TrackballDecorator> loadModelAsync(string path)
{
var tempVP = await new XamlReader().LoadAsync(XmlReader.Create(path)) as Viewport3D;
return new TrackballDecorator() { Content = tempVP, Transform = (tempVP.Camera.Transform as Transform3DGroup) };
}
但是因为 LoadAsync 方法返回一个 object 而不是 Task<object> 我不能使用 await 关键字。有什么方法可以克服或解决这个限制吗?
【问题讨论】:
-
异步等待只是语法糖。如果您真的想要它,只需将其包裹在
new TaskFactory().StartNew() -
我不确定我是否理解。我需要异步执行 XAML 加载,并且需要在该任务完成后实例化 TrackballDecorator,还有其他方法吗? TaskFactory().StartNew(LoadAsync...) 和 TaskFactory().StartNew
-
LoadAsync与await使用的异步方法完全不同。阅读LoadAsync的 MSDN 文档:它返回一个将异步添加新元素的文档。在这种情况下,这不是您想要的。 -
您需要使用 XamlReader.LoadCompleted 事件来判断异步操作何时完成。 msdn.microsoft.com/en-us/library/…
-
Matt 做对了 - 我错过了 XamlReader 上的事件处理程序,它解决了我的问题。
标签: c# wpf asynchronous .net-4.5 async-await