2015-03-17 3 views
0

Я работаю на 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. Применяется при сбое приложения.

Я знаю, почему это происходит из-за задачи async. Но я не знаю, как решить эту проблему. Пожалуйста, дайте мне решение.

Я получаю следующее исключение.

Исключение типа «System.UnauthorizedAccessException» произошло в AsyncTesting.exe, но не был обработан в пользовательском коде

Доступ запрещен. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED))

+1

Пожалуйста, сообщите нам подробнее об аварии. У вас есть исключения? –

+0

Пожалуйста, проверьте Редактировать. –

+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(); 
} 

Если закрыть первый диалог Quicky, это будет хорошо, но если вы этого не сделаете, после второго (когда второй диалог будет показан), у вас будет исключение.

Такая же ситуация и в вашем случае - вы быстро нажимаете кнопку, отвечающую за показ диалога, - первая появляется, но второе событие с разрешенным щелчком вызывает исключение. В этом случае вы ча использовать, например, простой флаг:

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; 
} 

Вы можете также думать о Отключение кнопки вместо того, чтобы использовать флаг.

+0

Thanx Bro, It's Working..but, я думаю, что это один из вариантов исправления. –

+0

@ChiragSolanki Это просто вопрос дизайна. Есть много мест, где можно исключить исключение, и вам придется обращаться с ними. – Romasz

Смежные вопросы