覆盖异步任务时应用程序崩溃

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 这只是设计问题。有很多地方可以抛出异常,你必须处理它们。

以上是关于覆盖异步任务时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

仅在应用关闭时运行异步任务

使用异步任务

未触发异步任务

分析崩溃以查找应用程序中的安全漏洞

从 AsyncTask doInBackground 返回时应用程序崩溃 [重复]

Xamarin - 覆盖函数中的 iOS 异步任务