此问题与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)和异常处理,我认为它没有造成任何麻烦(但是: - )
答案 0 :(得分:2)
陷阱1:
Thread.Sleep(100);
从不。使用WaitMessage()。
否则,可能会推出自己的消息循环,但在您的方案中,它似乎毫无意义。
您可能还想检查Application.Run()代码(例如.Net Reflector)。
答案 1 :(得分:2)
如果要自定义消息处理,请考虑实现IMessageFilter,然后调用Application.AddMessageFilter告诉标准消息泵调用您的过滤器函数。
答案 2 :(得分:0)
是的......我认为某些组件不能使用该代码。其中一些需要存在于其中包含Application.Run的线程中,以便有效地接收其消息。