线程是否有可能在不抛出异常的情况下死亡

本文关键字:情况下 抛出异常 是否 有可能 线程 | 更新日期: 2023-09-27 18:30:31

我在生产机器上遇到过一种情况,其中我的 Windows 服务中的线程似乎只是死亡,没有引发异常。 到目前为止,我的日志记录还不够冗长,无法确定它正在死亡的确切代码行;为此,我部署了一个具有更详细日志记录的新版本。 但是,在我得到一把吸烟枪之前,我的怀疑落在我创建新数据库上下文的代码行上。

该错误是不可预测的,除了它往往发生在高活动期间,并且通常与抛出数据库超时异常的其他线程相关(因此我上面怀疑)。 我可以处理的异常。 死线我不能。

知道为什么线程可能会默默地死去,或者干脆冻结吗? 或者该怎么办?

编辑:为了清楚起见,代码被一个try-catch块包围,并且catch会进行一些日志记录(使用log4net)。 "最后"也是如此。 我知道它正在工作,因为其他线程在抛出异常时留下了日志。 我在日志中看到的只是线程 x 到达某个调试点,然后再也没有看到或听到过,并且它应该做的工作仍未完成。

线程是否有可能在不抛出异常的情况下死亡

不,不是真的(但有点)。 线不会死,它们会完成。 线程可以成功完成,也可以失败 - 如果线程失败,则存储其异常,直到处理为止。 根据您实例化线程的方式,您可能会"触发并忘记",这意味着如果发生异常,您没有代码来处理和检索它。 这是双重的,因为它会导致未释放的资源(它们正在等待您检索和处理异常)。

但是,您尚未提供已诊断内容的任何详细信息。 您使用什么线程方法/框架(有很多)?您是否正在观察进程线程并看到它突然消失? 您是拍摄堆快照,还是在正在运行的进程似乎已经死亡后附加到它?

如果您可以访问该系统,我将使用以下命令进行调试:Visual Studio 2013 Remote Debugger。如果无法在开发环境中重现错误,这通常是一个不错的选择。

线程不会静默冻结或崩溃,请检查代码中是否有空catch块,或者它进入无限循环(或在任何时间点超时很长时间)。

也许你有一些代码给我们。