滚动自己的消息循环,有什么陷阱吗?
时间:2020-03-05 18:52:59 来源:igfitidea点击:
这个问题与关于异常处理的这个问题有些关系。我在那里找到的解决方法包括滚动我自己的消息循环。
所以我的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?
在另一个正在测试的应用程序中,加载(启动屏幕)和异常处理都使用了类似的方法,但我认为它不会造成任何麻烦(但:-))
解决方案
回答
陷阱1:
Thread.Sleep(100);
绝不。使用WaitMessage()。
否则,可能会推出我们自己的消息循环,但是在情况下,这似乎毫无意义。
我们可能还需要检查Application.Run()代码(例如,使用.Net Reflector)。
回答
是的...我认为某些组件无法使用该代码。其中一些需要驻留在具有Application的线程中。在其中运行以有效地提取其消息。
回答
如果要自定义消息处理,请考虑实现IMessageFilter,然后调用Application.AddMessageFilter告诉标准消息泵调用过滤器函数。