我正在使用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))
答案 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;
}
您还可以考虑禁用按钮,而不是使用标记。