Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 滚动您自己的消息循环,有任何陷阱吗?_.net_Winforms - Fatal编程技术网

.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块。。。