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 来禁用应用程序池的超时,并且再也没有发生该异常。
我是负责 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 来禁用应用程序池的超时,并且再也没有发生该异常。