【发布时间】:2014-12-26 16:20:19
【问题描述】:
我有一个带有async Task LoadData() 方法的DialogViewModel 类。此方法异步加载数据并显示此对话框,通知用户加载。代码如下:
try
{
var dialog = new DialogViewModel();
var loadTask = dialog.LoadData();
WindowManager.ShowDialog(dialog);
await loadTask;
}
catch (Exception ex)
{
Logger.Error("Error in DialogViewModel", ex);
// Notify user about the error
}
当LoadData 抛出异常时,在用户退出对话框之前不会对其进行处理。这是因为调用await 时处理了异常,直到WindowManager.ShowDialog(dialog) 完成才发生。
显示异步加载对话框的正确方法是什么?我试过这种方法:
- 在
OnShow()、构造函数或类似函数中调用LoadData()。但如果我需要在没有任何数据的情况下显示此对话框,这将不起作用 - 在显示对话框之前致电
await LoadData()。这样用户必须等待数据加载才能真正看到窗口,但我希望窗口立即显示加载指示器。
【问题讨论】:
-
不幸的是,这个问题的答案不适合我。我已经写过
Show()。我想需要从外部调用“LoadData()”,因为只有调用者才能确定是否加载数据。至于'BackgroundWorker' - 我希望有一种方法可以使用异步等待...... -
WindowManager.ShowDialog()来自哪里?是 Caliburn Micro 吗? -
是的,但这没关系:它可以是任何
ShowDialog()实现,例如查看注入。
标签: c# wpf mvvm dialog async-await