MessageBox.Show на ранней стадии запуска приложения вызывает завершение работы приложения - PullRequest
2 голосов
/ 30 июля 2011

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

I 'm показывает сообщение, используя MessageBox.Show.Поскольку проверка данных выполняется из рабочего потока, я переключаюсь на поток пользовательского интерфейса, чтобы выполнить этот вызов, а затем устанавливаю ManualResetEvent, чтобы сообщить рабочему потоку, когда пользователь подтвердил сообщение.

Iначать проверку / загрузку данных в самом начале жизненного цикла приложения из конструктора в основном классе приложения, выделив рабочий поток (используя ThreadPool).

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

Эти 10 секунд - большая подсказка - это говорит мне о том, что ОС считает, что приложение слишком долго инициализировалось (ОС убиваетприложения, которые запускаются слишком долго).

Я думаю, что мой MessageBox.Show блокирует поток пользовательского интерфейса до того, как App.RootFrameNavigating имеет шанс быть вызванным.

Мои вопросы:

  • Правильный ли мой диагноз?
  • Я бы предпочел начать свою загрузку данных раньше, потому что это почти полностью IO, кромедля этого окна сообщений, и чем раньше я смогу загрузить свою модель, тем лучше, но обычно ли вы задерживаете загрузку данных до более позднего жизненного цикла приложения?
  • Есть другие идеи / предложения?Я не могу гарантировать, какая страница будет стартовой, потому что приложение может возобновить работу с любой страницы.Я также думаю о том, чтобы MessageBox.Show задерживался до тех пор, пока приложение не инициализировалось, возможно, запрашивая флаг, установленный App.RootFrameNavigating - имеет ли это смысл?

Ответы [ 2 ]

0 голосов
/ 30 июля 2011

Итак, решение, которое я придумала, состоит в том, чтобы по-прежнему начинать загрузку данных в рабочем потоке с конструктора приложения, но в методе класса ShowDialog моего PhoneService, который я вызываю, чтобы вызвать MessageBox.Show, я проверяю посмотрите, произошла ли начальная навигация:

private readonly ManualResetEvent _appInitialized = new ManualResetEvent(false);

public void AppInitialized()
{
    _appInitialized.Set();
}


public void ShowDialog(string caption, string text, Action<MessageBoxResult> callback, MessageBoxButton button = MessageBoxButton.OKCancel)
{
    _appInitialized.WaitOne();
    DispatcherHelper.CheckBeginInvokeOnUI(() =>
    {
        var result = MessageBox.Show(text, caption, button);

        if (callback != null)
        {
            callback(result);
        }
    });
}

Тогда в моем классе приложений:

private bool _firstNavigate = true;
private void RootFrameNavigating(object sender, NavigatingCancelEventArgs e)
{
    if (_firstNavigate)
    {
        _firstNavigate = false;
        var navigationService = (NavigationService) sender;
        navigationService.Navigated += NavigationServiceNavigated;
    }
         ....


private void NavigationServiceNavigated(object sender, NavigationEventArgs e)
{
    var navigationService = (NavigationService)sender;
    navigationService.Navigated -= NavigationServiceNavigated;
    PhoneServices.Current.AppInitialized();
}

Кто-нибудь видел какие-либо проблемы с этим подходом? Кто-нибудь придумал лучший способ?

0 голосов
/ 30 июля 2011

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

...