关于.net:滚动您自己的消息循环,有什么陷阱吗?

关于.net:滚动您自己的消息循环,有什么陷阱吗?

Rolling your own message loop, any pitfalls?

这个问题与关于异常处理的这个问题有些关系。 我在那里找到的解决方法包括滚动我自己的消息循环。

所以我的Main方法现在基本上像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[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?

在另一个正在测试的应用程序中,加载(启动屏幕)和异常处理都使用了类似的方法,但我认为它不会引起任何麻烦(但:-))


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


陷阱1:

1
Thread.Sleep(100);

决不。 使用WaitMessage()。

否则,可能会推出您自己的消息循环,但是在您的情况下,这似乎毫无意义。

您可能还需要检查Application.Run()代码(例如,使用.Net Reflector)。


是的...我认为某些组件无法使用该代码。 其中一些需要驻留在具有Application的线程中。在其中运行以有效地接收其消息。


推荐阅读