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

时间:2015-03-17 10:10:55

标签: c# xaml windows-phone-8.1

我正在使用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))

1 个答案:

答案 0 :(得分:0)

我无法在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;
}

您还可以考虑禁用按钮,而不是使用标记。