.net 滚动您自己的消息循环,有任何陷阱吗?
这个问题与我的想法有点关联。我在那里找到的解决方法包括滚动我自己的消息循环 因此,我的主要方法现在基本上如下所示:.net 滚动您自己的消息循环,有任何陷阱吗?,.net,winforms,.net,Winforms,这个问题与我的想法有点关联。我在那里找到的解决方法包括滚动我自己的消息循环 因此,我的主要方法现在基本上如下所示: [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 r
[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)和异常处理都使用了类似的方法,我认为这不会造成任何问题(但:-)陷阱1:
Thread.Sleep(100);
从来没有。使用WaitMessage()
否则,您可以展开自己的消息循环,但在您的场景中,这似乎有些毫无意义
您可能还需要检查Application.Run()代码(例如,使用.Net Reflector)。是。。。我认为有些组件无法使用该代码。其中一些需要在一个有应用程序的线程中运行。在其中运行以有效地获取消息。 < P>如果您想自定义消息处理,请考虑实现IsEaseGuffter,然后调用Application.AddMessageFilter,告诉标准消息泵调用您的过滤函数。在.NET中似乎没有对等的WaitMessage,并且仅对消息循环使用p/Invoke似乎有点复杂。(并不是说这很难,但不可能是那样的……)另外,我的另一个问题也没有其他解决方案(请参阅此问题中的链接),那么为什么它毫无意义呢但如果你认为pinvoke太牵扯进来了,你应该再次考虑尝试编写自定义消息循环。关于你的另一个问题,如果你出于某种模糊的原因想要在未处理的异常事件中处理异常,请做好一些黑客攻击的准备。根据我的经验,体面的高级异常处理总是一个大的黑客攻击,我希望尽可能地完成它。在调试/日志输出中获取最内部的异常不是一个选项,在所有事件处理程序中复制粘贴try-catch块也不是…关于WaitMessage,我只是在线程之前不会执行P/Invoke。睡眠实际上会带来一些严重的麻烦。。。Wrt在Application.ThreadException事件中处理异常(在win32概念中,AFAIK实际上不是一个未处理的异常事件):这实际上是我想要阻止的。但是它需要我滚动我自己的messageloop,或者在代码中散布try-catch块。。。