为什么在 Page 构造函数中等待 MessageDialog 永远不会结束?
Why await MessageDialog in Page constructor nevers ends?
当我的 UWP 应用程序启动时,在初始屏幕期间,我需要等待 MessageDialog
的结果。所以,我把这个 MessageDialog
放在 MainPage
构造函数中:
private async Task ParseConfiguration()
{
var dialog = new MessageDialog("Message", "Title");
dialog.Commands.Add(new UICommand { Label = "Exit", Id = 0 });
await dialog.ShowAsync();
}
public MainPage()
{
ParseConfiguration(); // works, but I need to wait
ParseConfiguration().Wait(); // never exits this call
}
我该如何解决这个问题?
您正在等待该任务,从而阻塞了您的 UI 线程,因此无法显示对话框(显然还需要 UI 线程才能显示)并且整个过程陷入僵局。但是,无论如何,页面构造函数都不是执行此操作的好地方(以及一般的构造函数)。相反(例如,这不是唯一的地方)您可以在 Application.OnLaunched
:
中执行此操作
protected override async void OnLaunched(LaunchActivatedEventArgs e) {
// some other code here
// parse configuration before main window is shown
await ParseConfiguration();
// some more code here, including showing main windo
}
这将使您的对话框在初始屏幕期间显示,但在显示主页之前(如您所愿)。如果出现问题,您也可以此时终止整个应用程序。
当我的 UWP 应用程序启动时,在初始屏幕期间,我需要等待 MessageDialog
的结果。所以,我把这个 MessageDialog
放在 MainPage
构造函数中:
private async Task ParseConfiguration()
{
var dialog = new MessageDialog("Message", "Title");
dialog.Commands.Add(new UICommand { Label = "Exit", Id = 0 });
await dialog.ShowAsync();
}
public MainPage()
{
ParseConfiguration(); // works, but I need to wait
ParseConfiguration().Wait(); // never exits this call
}
我该如何解决这个问题?
您正在等待该任务,从而阻塞了您的 UI 线程,因此无法显示对话框(显然还需要 UI 线程才能显示)并且整个过程陷入僵局。但是,无论如何,页面构造函数都不是执行此操作的好地方(以及一般的构造函数)。相反(例如,这不是唯一的地方)您可以在 Application.OnLaunched
:
protected override async void OnLaunched(LaunchActivatedEventArgs e) {
// some other code here
// parse configuration before main window is shown
await ParseConfiguration();
// some more code here, including showing main windo
}
这将使您的对话框在初始屏幕期间显示,但在显示主页之前(如您所愿)。如果出现问题,您也可以此时终止整个应用程序。