我是负责在 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 分钟,然后它就崩溃了。我只是被搞砸了吗?