覆盖异步任务时应用程序崩溃
Application Crashed while async task is override
我正在研究 windows phone 8.1.here 我正在创建简单的两页首页包含两个按钮。
<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 按钮时出现问题应用程序崩溃。
我知道为什么会发生这种情况是因为异步 task.but 我不知道这个问题的解决方案。
请给我解决方案。
我遇到异常。
'System.UnauthorizedAccessException' 类型的异常发生在 AsyncTesting.exe 中,但未在用户代码中处理
访问被拒绝。 (HRESULT 异常:0x80070005 (E_ACCESSDENIED))
我在 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;
}
您也可以想到 禁用 按钮而不是使用标志。
我正在研究 windows phone 8.1.here 我正在创建简单的两页首页包含两个按钮。
<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 按钮时出现问题应用程序崩溃。
我知道为什么会发生这种情况是因为异步 task.but 我不知道这个问题的解决方案。 请给我解决方案。
我遇到异常。
'System.UnauthorizedAccessException' 类型的异常发生在 AsyncTesting.exe 中,但未在用户代码中处理
访问被拒绝。 (HRESULT 异常:0x80070005 (E_ACCESSDENIED))
我在 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;
}
您也可以想到 禁用 按钮而不是使用标志。