我正在使用windows服务来生成报告,比如说大约2K的报告。我也在使用TPL来提高性能。我观察到,在本地机器上,它在40报告下工作良好,但在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()方法()中编写了适当的日志记录,以跟踪生成报告时发生的情况。但我没有看到任何错误或可疑的东西。它只是悄悄地溜走而不留下任何痕迹。
发布于 2020-02-25 19:30:13
答案是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);Edit1
服务快速启动和结束的原因是它做了所有它期望做的事情。它只是创建任务,然后就完成了。
https://stackoverflow.com/questions/60393070
复制相似问题