代码之家  ›  专栏  ›  技术社区  ›  Andomar

C#应用程序意外终止

  •  11
  • Andomar  · 技术社区  · 16 年前

    我们运行一个C#控制台应用程序,启动多个线程进行工作。主要功能如下所示:

    try
    {
        DoWork();
    }
    catch (Exception err)
    {
        Logging.Log("Exception " + err.ToString());
    }
    Logging.Log("Finished");
    

    这个 DoWork()

    编辑:线程的创建方式如下:

    new Thread(SomeObj.StartFunc).Start();
    

    有些消失发生在没有线程运行时。

    另外,我们安装了DebugDiag,其中有一条规则,在程序崩溃时创建崩溃转储。当进程消失时,它没有创建任何转储文件。

    8 回复  |  直到 12 年前
        1
  •  9
  •   Peter Mortensen Pieter Jan Bonestroo    7 年前

    运行控制台应用程序时使用的标识是什么?

    this blog post

    更新:看起来您的场景与我们的经历相似。在控制台事件处理程序中,需要检查 注销 事件并返回true。看看 this KB article .

    public static void inputHandler(ConsoleCtrl.ConsoleEvent consoleEvent)
    {
       if (ConsoleEvent == ConsoleCtrl.ConsoleEvent.CtrlLogOff)
           return true;
       return false;
    }
    
        2
  •  9
  •   Peter Mortensen Pieter Jan Bonestroo    7 年前

        3
  •  5
  •   Sean Reilly    16 年前

    DoWork方法正在生成的某个线程可能正在引发异常。本例中的默认行为是终止进程。您可以使用 AppDomain.UnhandledException

        4
  •  3
  •   Joel Coehoorn    16 年前

    当主功能退出时,控制台程序退出。由于DoWork只生成了几个线程,所以它会立即将控制权返回到main,并且由于main没有其他事情要做,所以它退出,程序结束。此时,由DoWork生成的线程也被杀死。

    它以前工作过,这意味着DoWork()中的某些内容需要等待现在立即返回(已损坏)的线程,或者该部分仍然工作,但以前需要很长时间才能返回的线程现在中止并立即返回。

        5
  •  3
  •   Peter Mortensen Pieter Jan Bonestroo    7 年前

        6
  •  2
  •   Peter Mortensen Pieter Jan Bonestroo    7 年前

    在过去,我曾以与您类似的方式(没有异常跟踪,也没有终止日志消息)使程序在没有跟踪的情况下消失。几乎所有的时间都与杀死堆栈有关(这个网站的名字总是让我想起)。

        7
  •  2
  •   Peter Mortensen Pieter Jan Bonestroo    7 年前

    另一种可能是,在某个地方,您有代码调用Environment.Exit()。尝试对代码进行全文搜索以进行双重检查。你永远不知道!

        8
  •  2
  •   Peter Mortensen Pieter Jan Bonestroo    7 年前

    小心;有些异常无法捕获:OutOfMemoryException和StackOverflowException。

    因此,您的程序将可怕地死掉,但不会死掉。