2013-04-16 3 views
0

Я разрабатываю простое приложение для OSX с MonoMac. Когда мой опыт применения необработанного исключения, я ловлю их:NSApplication.SharedApplication.Terminate фактически не завершает мое приложение после необработанного исключения

AppDomain.CurrentDomain.UnhandledException + = (отправитель, е) => Неизвестных (e.ExceptionObject как исключение);

Внутри функции Unhandled() я регистрирую исключение и запускаю модальное окно, информирующее пользователя о том, что что-то пошло не так.

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

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

Если я удаляю указанную выше строку кода, приложение полностью закрывается при сбое.

Я пытаюсь заставить приложение бросить по телефону:

NSApplication.SharedApplication.Terminate(myAppDelegate); 

Но это, кажется, ничего не делать вообще. Я использую ту же самую строку кода в кнопке Quit приложения, и там она работает так, как ожидалось, поэтому после обнаружения необработанного исключения должно быть что-то особенное. Но что?

Я перекрываться следующее в моем AppDelegate на всякий случай, но это, кажется, не имеет никакого значения:

public override NSApplicationTerminateReply ApplicationShouldTerminate (NSApplication sender) 
{ 
    return NSApplicationTerminateReply.Now; 
} 

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

EDIT: Я должен был что-то сделать неправильно, когда тестировал это. Он действительно работает так, как если бы я не отображал форму ошибки.

Любые идеи?

ответ

1

У меня нет ответа для вас точно, и комментарий не будет содержать мой образец кода; но я могу сказать вам, что я концептуально делаю почти то же самое в своем приложении, и все работает отлично. Мой код:

private static void OnException(Exception ex) 
{ 
    new NSObject().InvokeOnMainThread(() => { 
     try 
     { 
      using (ErrorWindowController frmErrorMessage = new ErrorWindowController(ex)) 
      { 
       Console.WriteLine(ex); 
        NSApplication.SharedApplication.RunModalForWindow(frmErrorMessage.Window); 
      } 
     } 
     finally 
     { 
       NSApplication.SharedApplication.Terminate(NSApplication.SharedApplication); 
     } 
    }); 
} 

EDIT:

Убедитесь, что вы останавливаете модальную сессию при закрытии окна или вызов RunModalForWindow никогда не вернется.

Я закрываю мое модальное окно с помощью кнопки, что-то вроде этого:

partial void butClose_Click(NSObject sender) 
{ 
    this.Window.OrderOut(sender); 
    this.Window.Close(); 

    NSApplication.SharedApplication.StopModal(); 
} 
+0

@ErlendD. см. мое редактирование – TheNextman

+0

Да, все. Благодаря! –