Прокручивая свой собственный цикл сообщений, какие-нибудь подводные камни? - PullRequest
2 голосов
/ 14 сентября 2008

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

Итак, мой метод Main теперь выглядит примерно так:

[STAThread]
static void Main() {
  // this is needed so there'll actually an exception be thrown by
  // Application.Run/Application.DoEvents, instead of the ThreadException
  // event being raised.
  Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);

  Application.EnableVisualStyles();
  Application.SetCompatibleTextRenderingDefault(false);

  Form form = new MainForm();
  form.Show();

  // the loop is here to keep app running if non-fatal exception is caught.
  do {
    try {
      Application.DoEvents();
      Thread.Sleep(100);
    }
    catch (Exception ex) {
      ExceptionHandler.ConsumeException(ex);
    }
  }
  while (!form.IsDisposed);
}

Что мне интересно, тем не менее, это безопасный / достойный способ заменить более типичный 'Application.Run (new MainForm ());' , независимо от того, используется ли он для обработки исключений или для чего-либо еще, или я всегда должен придерживаться Application.Run?

В другом приложении, которое сейчас тестируется, аналогичный подход используется и для загрузки (заставка), и для обработки исключений, и я не думаю, что это вызвало какие-либо проблемы (пока: -))

Ответы [ 3 ]

2 голосов
/ 15 сентября 2008

Если вы хотите настроить обработку сообщений, рассмотрите возможность реализации IMessageFilter, а затем вызовите Application.AddMessageFilter, чтобы сообщить стандартному насосу сообщений для вызова вашей функции фильтра.

2 голосов
/ 14 сентября 2008

Подводный камень 1:

Thread.Sleep(100);

Никогда. Используйте WaitMessage ().

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

Вы также можете проверить код Application.Run () (например, с помощью .Net Reflector).

0 голосов
/ 14 сентября 2008

Да ... Я думаю, что некоторые компоненты не будут работать с этим кодом. Некоторым из них требуется жить в потоке, в котором есть Application.Run, чтобы эффективно получать сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...