C#应用程序意外终止

And*_*mar 11 .net c#

我们运行一个C#控制台应用程序,启动多个线程来完成工作.主要功能看起来像这样:

try
{
    DoWork();
}
catch (Exception err)
{
    Logging.Log("Exception " + err.ToString());
}
Logging.Log("Finished");
Run Code Online (Sandbox Code Playgroud)

DoWork()函数从数据库中读取新作业,并生成线程以分别处理一个工作项.从上周开始,应用程序开始神秘地消失.它从进程列表中消失,事件日志中没有条目.日志文件显示工作到某一点:它不记录异常,或"完成"行.

有关C#应用程序如何消失的任何线索?

编辑:线程创建如下:

new Thread(SomeObj.StartFunc).Start();
Run Code Online (Sandbox Code Playgroud)

当没有线程运行时,会发生一些消失.

PS我们安装了DebugDiag,其规则是在我们的程序崩溃时创建崩溃转储.当进程消失时,它没有创建任何转储文件.

Grz*_*nio 9

你需要在每个线程工作的函数的顶层有一个类似的catch块.如果某个线程上有未捕获的异常,它将终止该应用程序,并且主线程上的catch块不会有帮助.


Vas*_*nan 9

你用来运行控制台应用程序的身份是什么?

此外,您可能希望使用SetConsoleCtrlHandler来捕获控制台事件.请查看此博客文章了解更多详情.当控制台应用程序在服务帐户下运行时,我们遇到了类似的问题,它偶尔会被终止.我不确定这是不是你遇到的.让我知道我可以发布一些代码.

更新:看起来您的场景类似于我们所经历的.在控制台事件处理程序中,您需要检查LogOff事件并返回true.看看这篇KB文章.

public static void inputHandler(ConsoleCtrl.ConsoleEvent consoleEvent)
{
   if (ConsoleEvent == ConsoleCtrl.ConsoleEvent.CtrlLogOff)
       return true;
   return false;
}
Run Code Online (Sandbox Code Playgroud)

  • 你怎么从void函数返回一个布尔值? (5认同)
  • 我添加了日志记录,而CtrlLogOff事件确实是导致计划任务退出的原因.问题解决了,但我们仍然想知道CtrlLogOff事件的来源! (2认同)

Sea*_*lly 5

DoWork方法产生的其中一个线程可能会抛出异常.在这种情况下,默认行为是进程终止.您可以通过使用AppDomain.UnhandledException事件来覆盖默认行为来阻止这种情况发生.