2

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

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

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

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

即使确实发生了此异常,我如何确保作业继续运行?

我的代码如下:

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

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

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

编辑:添加应用程序失败的行(至少这是堆栈跟踪告诉我的。

整个工作非常广泛,我不能在这里发布。

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 表非常大,即使它的条目在被删除后被删除处理。

Edit2:事实上,代码在类的任何随机部分都失败了。它运行了大约 10 分钟,然后它就崩溃了。我只是被搞砸了吗?

4

1 回答 1

3

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

它与代码无关。

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

于 2019-12-20T15:06:08.987 回答