我们运行一个C#控制台应用程序,启动多个线程来完成工作。主要功能看起来像这样:
try
{
DoWork();
}
catch (Exception err)
{
Logging.Log("Exception " + err.ToString());
}
Logging.Log("Finished");
DoWork()
函数从数据库中读取新作业,并生成线程以处理每个工作项。从上周开始,应用程序开始神秘地消失。它从进程列表中消失,事件日志中没有条目。日志文件显示工作到某一点:它不记录异常,或“完成”行。
有关C#应用程序如何消失的任何线索?
编辑:线程创建如下:
new Thread(SomeObj.StartFunc).Start();
当没有线程正在运行时,会发生一些消失。
P.S。我们安装了DebugDiag,其规则是在我们的程序崩溃时创建崩溃转储。当进程消失时,它没有创建任何转储文件。
答案 0 :(得分:9)
你需要在每个线程工作的函数的顶层有一个类似的catch块。如果某个线程上有未捕获的异常,它将终止该应用程序,并且主线程上的catch块不会有帮助。
答案 1 :(得分:9)
您用于运行控制台应用程序的身份是什么?
此外,您可能希望使用SetConsoleCtrlHandler来捕获控制台事件。请查看this blog post了解更多详情。当控制台应用程序在服务帐户下运行时,我们遇到了类似的问题,它偶尔会被终止。我不确定这是不是你遇到的。请告诉我,我可以发布一些代码。
更新:看起来您的情景类似于我们所经历的情景。在控制台事件处理程序中,您需要检查 LogOff 事件并返回true。请看this KB article。
public static void inputHandler(ConsoleCtrl.ConsoleEvent consoleEvent)
{
if (ConsoleEvent == ConsoleCtrl.ConsoleEvent.CtrlLogOff)
return true;
return false;
}
答案 2 :(得分:5)
DoWork方法产生的其中一个线程可能会抛出异常。在这种情况下,默认行为是进程终止。您可以使用AppDomain.UnhandledException事件覆盖默认行为来阻止这种情况发生。
答案 3 :(得分:3)
它可能是抛出异常的Logging.Log函数。
答案 4 :(得分:3)
主函数退出时,控制台程序退出。由于DoWork只生成了几个线程,它就会立即将控制权返回给main,因为Main没有其他任何东西可以退出并且程序结束。此时DoWork产生的线程也被杀死了。
之前它的工作意味着DoWork()中有东西等待那些现在立即返回的线程(已损坏)或者该部分仍然有效但是过去需要很长时间才能返回的线程现在中止并且马上回来。
答案 5 :(得分:2)
过去,我已经设法让程序以类似的方式消失(没有异常跟踪和终止日志消息)。几乎所有的时间都与杀死堆栈有关(这个网站的名字总是让我想起)。
您可能突然尝试处理比平常更多的数据,或者使用可重入的例程,或者使用指针“聪明”。
免责声明:我的经验是使用Win32 C ++应用程序,而不是C#。
答案 6 :(得分:2)
可能是内存泄漏。如果您的应用程序占用太多内存,Windows将终止它。您可以检查您使用的内存量:如果它随着时间的推移而增长,则可能会出现内存泄漏。
另一种可能性是,在某处,你有代码调用Environment.Exit()。尝试通过代码进行全文搜索以进行仔细检查。你永远不会知道!
答案 7 :(得分:2)
小心;有一些无法捕获的异常:OutOfMemoryException和StackOverflowException。
因此,你的程序会死得很厉害,但是会默默无闻。