C# Web App FluentScheduler Job 在 ThreadAbortException 后不会重复

C# Web App FluentScheduler Job won't repeat after ThreadAbortException

我是负责 IIS 10.0 上的 C# Web 应用程序 运行 的开发人员,我使用 FluentScheduler 库来安排我的作业。

此作业执行数据库查询,然后生成一些文件。最近我们的作业一直在失败,因为它们 运行ning 时间太长并且 Windows 杀死了线程(这只发生在特定的日子,需要处理大量数据)。

在对数据库访问进行了一些优化后,我成功地杀死了一堆线程,但它仍然偶尔会发生。

问题是在它的线程被杀死(并记录异常)后,作业在预定时间停止运行。

即使发生此异常,我如何确保作业保持 运行ning?

我的代码如下:

Schedule(new GenerateFiles()).NonReentrant().ToRunOnceAt(DateTime.Now.AddMinutes(10)).AndEvery(30).Seconds();

第一个 运行 有 10 分钟的延迟,因为我们在数据库中缓存了一些可用信息以提高应用程序的性能,而此作业使用该缓存中的数据,我不知道如何让它只在缓存完成后才开始,所以我添加了这个延迟。

在我的作业中捕获并记录的任何其他异常都不会导致此问题。只有当线程 运行 运行时间过长并且 Windows 杀死它时,它才会再次停止 运行ning。

编辑:添加应用程序失败的行(至少 Stack Trace 告诉我的是这样。

整个工作范围很广,我真的不能 post 在这里。

foreach (var datumToGenerate in context.GenerateData.Include(f => f.Datum))
            {
                var datum = datumToGenerate.Datum;

                if (!datum.Generated)
                {
                    output.Add(datum);
                    i++;
                    if (i == 100) return output;
                }
            }

如您所见,我将一次要处理的条目数降低到 100,但即使将其设置为 50 或较低的数字,我最终还是收到错误,因为 GenerateData table 相当很大,即使它的条目在处理后被删除。

Edit2:事实上,代码在 class 的任何随机部分都失败了。它 运行 可以正常运行大约 10 分钟,然后就崩溃了。我是不是完蛋了??

我和我的同事找到了问题的答案。

与代码无关。

IIS 的应用程序池默认休眠超时为 20 分钟。我们通过将其值设置为 0 来禁用应用程序池的超时,并且再也没有发生该异常。