多线程窗口服务停止工作



我正在使用windows服务生成报告,比如2K左右的报告。我也使用TPL来提高绩效。我观察到,在本地机器上,它对40报告工作正常,但在2K的UAT上,它不能正常工作,它异常停止工作,windows服务状态启动。系统事件查看器中没有事件日志条目(我认为我没有得到事件日志条目,因为服务状态已启动,并且不会异常终止(

这是我的代码块。

foreach (pt_report report in reportCollection)
{
using(dbContent context=new dbContext())
{
//Execute 1 sp which takes around 2 minutes.
//do some db operation to update status of sp execution.
//This step is mandatory for all 2K plan before running Async task.
}
if(report.Status != Completed) //check for completion of report generation
{
Task generateReport = new Task(delegate
{
ScheduleMassReportGeneration(report); // This takes around 2-3 min more to generate pdf.
});
generateReport.Start();
//Problem #1 occurs (see below description).
}
}

问题1:

我知道当异步任务开始时,我需要写一些东西来连接线程,这样我就可以检查执行状态。基于上面的代码,我无法控制它,现在它就像孤儿一样。现在我想控制它,这样我就可以检查线程/任务发生了什么,并将适当的状态记录到数据库中,然后重新运行这些任务。

PS:正确的日志记录是用ScheduleMassReportGeneration()方法((编写的,用来跟踪生成报告时发生的事情。但我没有看到任何错误或可疑的迹象。它只是溜走了,没有留下任何痕迹。

答案是it depends。。。
通常,当你想启动任务并控制它时,你可以使用

await Task.Run(() => ScheduleMassReportGeneration(report));

但在您的情况下,报告生成似乎是CPU密集型的,在这种情况下,将work委派给任务可能不会带来好处,因为在生成报告时无法执行任何操作。

如果报告可以并行处理,那么您可以为每个报告创建任务,并最终等待所有报告完成:

var tasks = reportCollection.Where(r => r.Status != Completed)
.Select(r => Task.Run(() => ScheduleMassReportGeneration(r)))
.ToArray();
Task.WaitAll(tasks);

第1版

服务之所以快速启动和结束,是因为它完成了预期的一切。它只是创建任务,然后完成。

最新更新