Хобрук: Ваш путь к мастерству в программировании

Множественные вызовы MessageDialog вызывают сбой в Windows Phone 8.1

Я разрабатываю универсальное приложение, использующее MVVM-Light. Я вызываю WebServices из ViewModels и выбрасываю исключения, возникающие при вызовах WebServices, в ViewModels: TimeOut, Wrong URL, Server Exception,...

Я создал класс "ExceptionsMsgHelper.cs", который централизует сообщения, отображаемые для каждого из этих исключений, через MessageDialog.

Моя домашняя страница основана на Pivot, содержащем несколько данных: некоторые веб-службы вызываются асинхронно. Поэтому я встречаю сбой, если я показываю исключение в MessageDialog через класс «ExceptionsMsgHelper.cs», тогда как предыдущее исключение также отображается в другом MessageDialog.

Вот часть моего исходного класса:

    public class ExceptionsMsgHelper
    {
        public async static void MsgboxWebserviceErrors(WebServiceErrorsException wseE, string errors)
        {
            Windows.UI.Popups.MessageDialog msgbox =
            new Windows.UI.Popups.MessageDialog("The Websercice '" + wseE.WebService + "' has returned errors : \n" + errors,
                "Unexpected data");        
            await msgbox.ShowAsync();
        }
    }

=> Если я дважды вызываю "msgbox.ShowAsync()", я получаю исключение "System.UnauthorizedAccessException": с сообщением "Доступ запрещен. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED))"< /эм>

Я так искал решения, чтобы исправить это:

Код:

    public class ExceptionsMsgHelper
    {
        public async static void MsgboxWebserviceErrors(WebServiceErrorsException wseE, string errors)
        {
            Windows.UI.Popups.MessageDialog msgbox =
            new Windows.UI.Popups.MessageDialog("The Websercice '" + wseE.WebService + "' has returned errors : \n" + errors,
                "Unexpected data");        
            CoreDispatcher dispatcher = CoreWindow.GetForCurrentThread().Dispatcher;
            dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
            {
                await msgbox.ShowAsync();
            });
        }
    }

=> Но я всегда сталкиваюсь с одним и тем же исключением.

С этим кодом:

    public class ExceptionsMsgHelper
    {
        private static IAsyncOperation<IUICommand> messageDialogCommand = null;
        public async static Task<bool> ShowDialog(MessageDialog dlg)
        {

            // Close the previous one out
            if (messageDialogCommand != null)
            {
                messageDialogCommand.Cancel();
                messageDialogCommand = null;
            }

            messageDialogCommand = dlg.ShowAsync();
            await messageDialogCommand;
            return true;
        }

        public async static void MsgboxWebserviceErrors(WebServiceErrorsException wseE, string errors)
        {
            Windows.UI.Popups.MessageDialog msgbox =
            new Windows.UI.Popups.MessageDialog("The Websercice '" + wseE.WebService + "' has returned errors : \n" + errors,
                "Unexpected data");        
            CoreDispatcher dispatcher = CoreWindow.GetForCurrentThread().Dispatcher;
            dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
            {
                await ShowDialog(msgbox);
            });
        }           
    }

=> Но и в этом случае я всегда получаю одно и то же исключение.

Теперь код:

    public class ExceptionsMsgHelper
    {
        public async static void MsgboxWebserviceErrors(WebServiceErrorsException wseE, string errors)
        {
            Windows.UI.Popups.MessageDialog msgbox =
            new Windows.UI.Popups.MessageDialog("The Websercice '" + wseE.WebService + "' has returned errors : \n" + errors,
                "Unexpected data");   
            await MessageDialogExtensions.ShowAsyncQueue(msgbox);
        }
    }

    public static class MessageDialogExtensions
    {
        private static TaskCompletionSource<MessageDialog> _currentDialogShowRequest;
        public static async Task<IUICommand> ShowAsyncQueue(this MessageDialog dialog)
        {
            if (!Window.Current.Dispatcher.HasThreadAccess)
            {
                throw new InvalidOperationException("This method can only be invoked from UI thread.");
            }

            while (_currentDialogShowRequest != null)
            {
                await _currentDialogShowRequest.Task;
            }

            var request = _currentDialogShowRequest = new TaskCompletionSource<MessageDialog>();
            var result = await dialog.ShowAsync();
            _currentDialogShowRequest = null;
            request.SetResult(dialog);

            return result;
        }
    private static IAsyncOperation<IUICommand> messageDialogCommand = null;
    public async static Task<bool> ShowDialog(this MessageDialog dlg)
    {

        // Close the previous one out
        if (messageDialogCommand != null)
        {
            messageDialogCommand.Cancel();
            messageDialogCommand = null;
        }

        messageDialogCommand = dlg.ShowAsync();
        await messageDialogCommand;
        return true;
    }

    #endregion
    }

=> И это работает для меня.

Но, как говорит автор, это, вероятно, не лучшее решение:

Закройте существующий диалог, когда вам нужно открыть новый. Это самый простой вариант и, возможно, лучший, хотя вы рискуете отменить диалог, который может быть каким-то важным в зависимости от того, о чем ваши диалоги. Ставьте диалоги в очередь, чтобы старые не удалялись, а новые появлялись после закрытия старых. Это гарантирует, что все диалоги будут закрыты пользователем, но это может быть проблемой, если ваше приложение может каким-то образом начать показывать сотни диалогов. Открывайте новый только в том случае, если он еще не отображен. Теперь существует риск того, что более новое сообщение не будет показано, что звучит более проблематично, чем первый вариант.

=> Я хотел бы понять, почему я не могу применить одно из двух первых решений, которые кажутся более адаптированными


Ответы:


1

Конечно, вы не можете отображать 2 или более диалоговых окон сообщений одновременно (ограничения Windows Phone). Кроме того, MesssageDialog на Windows Phone 8.1, вероятно, имеет ошибку и не может быть закрыта.

Если закрытие предыдущего диалога будет решением для вас, попробуйте использовать ContentDialog вместо MessageDialog. Проверьте мой ответ в этой теме: Программное закрытие MessageDialog в WP 8.1 РТ

Я думаю, что это решит вашу проблему.

16.10.2015
Новые материалы

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

Обзор: Машинное обучение: классификация
Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

Разработка расширений Qlik Sense с qExt
Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..


© 2024 hobruk.ru, Хобрук: Ваш путь к мастерству в программировании