await this.ShowMessageAsync在WPF C#中不起作用

Var*_*nJi 2 c# wpf asynchronous

我有一个小问题,等待this.ShowMessageAsync()方法.我搜索了很多我的问题,但还没有成功.

对于下面的代码我收到错误";期望"

private void removeGameButton_Click(object sender, RoutedEventArgs e)
{
     Task<MessageDialogResult> result = await this.ShowMessageAsync("Hi", "Message", MessageDialogStyle.AffirmativeAndNegative);
     if(result.Result == MessageDialogResult.Negative)
     {
         Console.WriteLine("No");
     }
     else
     {
         Console.WriteLine("yes");
     }
}
Run Code Online (Sandbox Code Playgroud)

我对"这个"感到错误.如果我没有使用await那么它工作正常,但后来我不知道从Message Dialogue获得结果.

我从https://www.nuget.org/packages/Microsoft.Bcl.Async安装了2次3次Microsoft.Bcl.Async

我真的很困惑.所以请帮我找到解决方案.提前致谢

Jay*_*cee 6

您需要声明为异步.因为它看起来像一个事件处理程序,你应该创建一个新方法来保存逻辑.

private async void removeGameButton_Click(object sender, RoutedEventArgs e)
{
   await DoWork();
}

private async Task DoWork()
{
     Task<MessageDialogResult> result = await this.ShowMessageAsync("Hi", "Message", MessageDialogStyle.AffirmativeAndNegative);
     if(result.Result == MessageDialogResult.Negative)
     {
         Console.WriteLine("No");
     }
     else
     {
         Console.WriteLine("yes");
     }
}
Run Code Online (Sandbox Code Playgroud)

其中一个原因是例外:如果您的异步方法生成异常,则Task在其签名中声明该方法,则异常将包含在Task对象中.例如:

Task myWork = null;
try 
{
   myWork = DoWork();
   await myWork; //await the Task then an exception occurs
}
catch(SomeException e)
{
   //now you can get at the exception in myWork.Exception
}
Run Code Online (Sandbox Code Playgroud)

如果执行此操作,则异常将包含在myWork Task对象中,例如通过myWork.Exception,其中包含聚合异常(由于嵌套的await表达式,可能会出现异常列表).如果在async void发生错误时纯粹声明方法,则最终会出现未观察到的异常.您可以使用事件处理程序在应用程序级别处理这些问题,并将其设置为观察.您还可以使用配置控制是否看到这些未观察到的异常.

<configuration> 
   <runtime> 
      <ThrowUnobservedTaskExceptions enabled="true"/> 
   </runtime> 
</configuration>
Run Code Online (Sandbox Code Playgroud)

默认情况下,enabled设置为false.