C# 为什么要在页面构造函数中等待MessageDialog永不结束?

C# 为什么要在页面构造函数中等待MessageDialog永不结束?,c#,asynchronous,async-await,uwp,messagedialog,C#,Asynchronous,Async Await,Uwp,Messagedialog,在启动屏幕期间,当我的UWP应用程序启动时,我需要等待消息对话框的结果。因此,我将这个消息对话框放在主页构造函数中: private async Task ParseConfiguration() { var dialog = new MessageDialog("Message", "Title"); dialog.Commands.Add(new UICommand { Label = "Exit", Id = 0 }); await dialog.ShowAsyn

在启动屏幕期间,当我的UWP应用程序启动时,我需要等待
消息对话框的结果。因此,我将这个
消息对话框
放在
主页
构造函数中:

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线程),整个过程都会死锁。然而,无论如何,页面构造函数并不是一个好的地方(以及通常的构造函数)。相反(例如,这不是唯一的地方),您可以在
应用程序中执行此操作。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
}

这将使您的对话框在启动屏幕期间显示,但在显示主页之前(如您所愿)。如果出现问题,您也可以在此时终止整个应用程序。

在显示对话框后,您可以将任何要执行的操作移动到该任务的继续部分:ParseConfiguration().ContinueWith(t=>{…在此执行任务…});请查看此帖子:@Evk ok,但我仍然需要等待异步任务的结果。请看一下:@Evk,因为例如,如果我无法读取配置,我希望应用程序退出。UWP上没有配置等待方法。