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
C#应用程序意外终止_C#_.net - Fatal编程技术网

C#应用程序意外终止

C#应用程序意外终止,c#,.net,C#,.net,我们运行一个C#控制台应用程序,启动多个线程进行工作。主要功能如下所示: try { DoWork(); } catch (Exception err) { Logging.Log("Exception " + err.ToString()); } Logging.Log("Finished"); DoWork()函数从数据库中读取新作业,并生成线程,每个线程处理一个工作项。从上周开始,这个应用程序开始神秘地消失。它将从进程列表中消失,并且事件日志中没有条目。日志文件显示到某一

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

try
{
    DoWork();
}
catch (Exception err)
{
    Logging.Log("Exception " + err.ToString());
}
Logging.Log("Finished");
DoWork()
函数从数据库中读取新作业,并生成线程,每个线程处理一个工作项。从上周开始,这个应用程序开始神秘地消失。它将从进程列表中消失,并且事件日志中没有条目。日志文件显示到某一点的工作:它不记录异常或“完成”行

关于C#应用程序如何会像那样消失,有什么线索吗

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

new Thread(SomeObj.StartFunc).Start();
有些消失发生在没有线程运行时


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

您需要在每个线程工作的函数的顶层有一个类似的catch块。如果线程上存在未捕获的异常,则会终止应用程序,而主线程上的catch块也不会有帮助。

可能是Logging.Log函数引发了异常。

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


它以前工作过,这意味着要么DoWork()中有东西等待现在立即返回(已损坏)的线程,要么该部分仍然工作,但一个过去需要很长时间才能返回的线程现在中止并立即返回。

我已经设法使程序以与您类似的方式消失,而不留痕迹(没有异常跟踪和终止日志消息)在过去。几乎所有的时间都与杀死堆栈有关(这个网站的名称总是提醒我)

您可能突然试图处理比平常多得多的数据,或者使用重入例程,或者对指针“聪明”


免责声明:我的经验是使用Win32 C++应用程序,而不是C语言。

< P>它可能是内存泄漏。如果应用程序占用太多内存,Windows会杀死它。您可以检查您使用的内存量:如果它随着时间增长,可能会出现内存泄漏。
另一种可能性是,在某个地方,您有代码调用环境。Exit()。请尝试在代码中进行全文搜索以进行双重检查。您永远不会知道!

可能是DoWork方法生成的某个线程正在引发异常。在这种情况下,默认行为是进程终止。您可以通过使用事件覆盖默认行为来阻止这种情况的发生。

有什么问题吗您用来运行控制台应用程序的身份

此外,您可能希望使用SetConsoletrlHandler捕获控制台事件。有关更多详细信息,请参阅。当控制台应用程序在服务帐户下运行时,我们遇到了类似问题,并且偶尔会终止。我不确定您是否遇到了此问题。请告诉我,我可以发布一些代码

更新:看起来您的场景与我们所经历的类似。在控制台事件处理程序中,您需要检查注销事件并返回true。请参阅


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


因此,您的程序会死掉,但不会死掉。

DoWork()在所有工作完成之前,函数不会返回,并且所有线程都已关闭。该程序多年来一直运行良好,处理了超过一百万个工作项。等等……我以为生成后台线程的应用程序退出时,只有后台线程会被杀掉?@Will:我认为这是Windows服务的行为。其他Windows应用程序也可以工作ke Joel describesThis没有解释为什么不调用Logging.Log(“Finished”);线程的顶级函数中有一个try/catch块。你说“…每个线程都可以工作”是什么意思?你是说“…每个线程都可以工作”吗?或者其他什么?日志功能很简单,并且有足够的可用磁盘空间。该程序在运行时保持单个StreamWriter打开,并使用锁{}保护对其的访问节。它由具有管理权限的帐户作为计划任务运行。我添加了处理程序并将其修改为记录事件,让它运行一段时间以查看是否成功!我添加了日志记录,并且CtrlLogOff事件确实是导致计划任务退出的原因。问题已解决,但我们仍然希望知道Ctr在哪里lLogOff事件来自!为什么从void函数返回布尔值?是的,但我希望这会触发DebugDiag并记录崩溃转储。可以捕获AFAIK
OutOfMemoryException
。感谢提示。内存使用量似乎没有增长,Exit()函数是我们检查的第一件事:)它是否总是在同一点崩溃/停止?这是在哪里?可能有人/事在扼杀这个过程吗?我们真的可以更详细地了解一下DoWork方法中的内容……停止是随机发生的,本周总共发生了5次。理论上,我认为有人可以登录并终止进程,但这听起来有点偏执。DoWork在创建和启动线程后做什么?它是否进入无限循环,直接退出,尝试加入后台线程,还是什么?它进入无限循环。后台线程在受lock{}语句保护的数组中更新其状态。当一个线程完成时,它会从数组中删除它自己的条目。
public static void inputHandler(ConsoleCtrl.ConsoleEvent consoleEvent)
{
   if (ConsoleEvent == ConsoleCtrl.ConsoleEvent.CtrlLogOff)
       return true;
   return false;
}