覆盖异步任务时应用程序崩溃
Posted
技术标签:
【中文标题】覆盖异步任务时应用程序崩溃【英文标题】:Application Crashed while async task is override 【发布时间】:2015-03-17 10:10:54 【问题描述】:我正在使用 windows phone 8.1。在这里我创建简单的两页首页包含两个按钮。
<Grid>
<StackPanel>
<Button x:Name="btnNextPage" Content="Next Page" HorizontalAlignment="Center" Click="btnNextPage_Click" />
<Button x:Name="btnMessageDisplay" Content="Message Display" HorizontalAlignment="Center" Click="btnMessageDisplay_Click" />
</StackPanel>
</Grid>
这里第一个按钮简单地完成从一个页面到另一个页面的导航,第二个是显示简单的消息对话框,如下所示。
MessageDialog msg = new MessageDialog("","");
async private void btnMessageDisplay_Click(object sender, RoutedEventArgs e)
msg.Content = "Hello Friends...";
msg.Title = "Message";
await msg.ShowAsync();
private void btnNextPage_Click(object sender, RoutedEventArgs e)
Frame.Navigate(typeof(SecondPage));
这很好。但是在按住第一个按钮并两次单击 btnMessageDisplay 按钮时会出现问题 应用程序崩溃了。
我知道为什么会因为异步任务而发生。但我不知道这个问题的解决方案。 请给我解决方案。
我得到以下异常。
AsyncTesting.exe 中出现“System.UnauthorizedAccessException”类型的异常,但未在用户代码中处理
访问被拒绝。 (来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED))
【问题讨论】:
请向我们提供有关崩溃的更多详细信息。你有什么例外吗? 所以你正在做一些你无权访问的事情,这几乎是这里任何人都可以说的。你在哪一行得到那个例外?什么是堆栈跟踪? 在这一行等待 msg.ShowAsync(); 【参考方案1】:我无法在 MSDN 上找到该指南,但 WP 上的系统可以一次显示一个对话框。当您尝试显示第二个对话框时,系统将抛出 UnauthorizedException。
做一个简单的测试:
private void TestBtn_Click(object sender, RoutedEventArgs e)
DispatcherTimer timer1 = new DispatcherTimer() Interval = TimeSpan.FromSeconds(3) ;
DispatcherTimer timer2 = new DispatcherTimer() Interval = TimeSpan.FromSeconds(4) ;
timer1.Tick += async (s1, e1) => timer1.Stop(); await new MessageDialog("First").ShowAsync(); ;
timer2.Tick += async (s2, e2) => timer2.Stop(); await new MessageDialog("Second").ShowAsync(); ;
timer1.Start(); timer2.Start();
如果你快速关闭第一个对话框,没关系,但如果你不这样做,一秒钟后(当要显示第二个对话框时),你会出现异常。
您的情况也是如此-您快速单击负责显示对话框的按钮-显示第一个,但第二个已解决的单击事件引发异常。在这种情况下,您可以使用简单的标志:
private bool btnResolved = true;
async private void btnMessageDisplay_Click(object sender, RoutedEventArgs e)
if (!btnResolved) return;
btnResolved = false;
msg.Content = "Hello Friends...";
msg.Title = "Message";
await msg.ShowAsync();
btnResolved = true;
您也可以考虑禁用按钮而不是使用标志。
【讨论】:
谢谢兄弟,它正在工作..但我认为这是一种修补。 @ChiragSolanki 这只是设计问题。有很多地方可以抛出异常,你必须处理它们。以上是关于覆盖异步任务时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章