滚动你自己的消息循环,任何陷阱?

时间:2008-09-14 14:23:16

标签: .net winforms

此问题与this question about exception handling略有关系。我发现那里的解决方法包括滚动我自己的消息循环。

所以我的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?

在另一个正在测试的应用程序中,类似的方法用于加载(splashscreen)和异常处理,我认为它没有造成任何麻烦(但是: - )

3 个答案:

答案 0 :(得分:2)

陷阱1:

Thread.Sleep(100);

从不。使用WaitMessage()。

否则,可能会推出自己的消息循环,但在您的方案中,它似乎毫无意义。

您可能还想检查Application.Run()代码(例如.Net Reflector)。

答案 1 :(得分:2)

如果要自定义消息处理,请考虑实现IMessageFilter,然后调用Application.AddMessageFilter告诉标准消息泵调用您的过滤器函数。

答案 2 :(得分:0)

是的......我认为某些组件不能使用该代码。其中一些需要存在于其中包含Application.Run的线程中,以便有效地接收其消息。