我是IIS10.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分钟,然后它就会崩溃。我完蛋了吗??
发布于 2019-12-20 15:06:08
我和我的同事找到了这个问题的答案。
这和代码无关。
IIS的应用程序池的默认睡眠超时时间为20分钟。通过将应用程序池的值设置为0,我们禁用了应用程序池的超时,从此不再发生此异常。
https://stackoverflow.com/questions/59412662
复制相似问题