这个问题与关于异常处理的这个问题有些关系。 我在那里找到的解决方法包括滚动我自己的消息循环。
所以我的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:
决不。 使用WaitMessage()。
否则,可能会推出您自己的消息循环,但是在您的情况下,这似乎毫无意义。
您可能还需要检查Application.Run()代码(例如,使用.Net Reflector)。
是的...我认为某些组件无法使用该代码。 其中一些需要驻留在具有Application的线程中。在其中运行以有效地接收其消息。