【发布时间】:2017-01-09 14:48:14
【问题描述】:
我有一个视图模型
protected override void Initialize()
{
this.InnerViewModel.LoadInformation();
this.IsInformationLoaded = true;
}
然而,this.InnerViewModel.LoadInformation(); 是 CPU 和 IO 密集型操作。可能需要几秒钟才能完成。
该模型的视图已绑定到 IsInformationLoaded 以显示“正在加载...”屏幕。
您可以想象,我当前的实现不显示“正在加载...”屏幕,而是在操作完成之前冻结 UI。
如何更改 Initialize 方法,以使 LoadInformation 异步?请记住,InnerViewModel 也是视图绑定的。
编辑:
以下作品
protected override async void Initialize()
{
await Task.Run(() =>
{
this.InnerViewModel.LoadInformation();
});
this.IsInformationLoaded = true;
}
// In InnerViewModel
public override void LoadInformation()
{
Thread.Sleep(3000);
Application.Current.Dispatcher.Invoke(() =>
{
this.SomethingObservable.Clear();
this.SomethingObservable.Add(...something ...);
});
}
但是如果可能的话,我真的很想摆脱Application.Current.Dispatcher。或者以某种方式将其移至Initialize()。我不想让InnerModel 知道它是如何执行的。
【问题讨论】:
-
如果在方法中设置
IsInformationLoaded = false,然后Task.Run(this.InnerViewModel.LoadInformation).ContinueWith(() => {this.IsInformationLoaded = true;});,会发生什么?如果在 Task.Run 之后的下一行将加载的布尔值设置为,它将在任务准备好之前执行该行。 -
如果这不是问题所在,您能否澄清一下您所说的“
Task.Run()和类似方法 [未成功]”的意思 -
我已按问题编辑@cubrr
-
对于您新发现的线程问题,您需要查看this question。
-
这可能会起作用,但是
InnerViewModel会知道它是以异步方式执行的,如果可以的话,我很想避免......