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
我真的很困惑.所以请帮我找到解决方案.提前致谢
您需要声明为异步.因为它看起来像一个事件处理程序,你应该创建一个新方法来保存逻辑.
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.