gpt4 book ai didi

asp.net - 如何找出我的线程在 ASP.NET 中被停止的原因?

转载 作者:行者123 更新时间:2023-12-02 17:54:26 27 4
gpt4 key购买 nike

我们的日志报告ThreadAbortException,它们以看似随机的时间间隔停止我们的 Quartz.NET 作业。据我了解,这通常不是由线程本身正在执行的操作引起的(例如从 FTP 服务器读取文件,或执行 LINQ to Entities 查询),而是因为某些外部进程告诉线程停止。此外,创建日志的方式让我相信,当我们收到这些错误时,整个 Web 应用程序正在重新启动,因此我猜测重新启动过程是导致线程首先中止的原因。

所以我的问题是:如何找出服务器/应用程序重新启动的原因?是否有日志可以为我提供每次重新启动的详细信息?是否存在我应该调查的此类问题的常见原因?

预先感谢您的帮助。

编辑

我刚刚与一些同事进行了讨论,听起来 IIS 在一段时间不活动后会自动将应用程序置于 sleep 状态,这可能是问题的一部分。经过一些研究,我发现 IIS 中的工作线程有一个“空闲超时”设置。我认为当应用程序在一定时间内没有处理任何请求时,它会发出关闭命令。由于某种原因,Quartz 不会立即关闭,而是等待下一个作业被触发,然后系统检测到该作业的线程并在它尝试运行时将其杀死。

所以我想我们需要想出一些方法来在系统想要关闭时优雅地完成任何正在运行的作业,并让 Quartz 在被告知时实际关闭(如果它没有运行任何作业)。有人有处理此类问题的经验吗?

最佳答案

正如 liho1eye 指出的那样,问题是由应用程序池关闭我们的应用程序引起的。由于某种原因,Quartz 显然没有立即关闭。相反,它会等到下一个作业运行并关闭,这意味着正在运行的作业必须通过 ThreadAbordException 关闭。

我们对此的解决方案有两个。首先,我们将 Quartz 更新到了更新的版本,这似乎让它表现得更好了一些。其次,在 Global.asax.cs 的 Application_End 方法中,我们添加了对 Scheduler.Shutdown(true) 的调用。这告诉调度程序停止触发其他触发器,然后等待所有当前运行的触发器完成,然后才允许应用程序结束。

关于asp.net - 如何找出我的线程在 ASP.NET 中被停止的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4347870/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com