【问题标题】: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();

标签: c# xaml windows-phone-8.1


【解决方案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 这只是设计问题。有很多地方可以抛出异常,你必须处理它们。
猜你喜欢
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 2013-10-02
  • 2016-04-14
  • 1970-01-01
  • 2019-07-04
相关资源
最近更新 更多