C# 多线程windows服务停止工作
我正在使用windows服务生成报告,比如2K左右的报告。我还使用TPL来提高性能。我观察到,在本地机器上,它可以正常工作40次报告,但在UAT上,它不能正常工作2K,它停止工作异常,windows服务状态启动。系统事件查看器中没有事件日志条目(我假设我没有获取事件日志条目,因为服务状态已启动,并且没有异常终止) 这是我的代码块C# 多线程windows服务停止工作,c#,.net,multithreading,thread-safety,task-parallel-library,C#,.net,Multithreading,Thread Safety,Task Parallel Library,我正在使用windows服务生成报告,比如2K左右的报告。我还使用TPL来提高性能。我观察到,在本地机器上,它可以正常工作40次报告,但在UAT上,它不能正常工作2K,它停止工作异常,windows服务状态启动。系统事件查看器中没有事件日志条目(我假设我没有获取事件日志条目,因为服务状态已启动,并且没有异常终止) 这是我的代码块 foreach (pt_report report in reportCollection) { using(dbContent context=new
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()method()中写入了正确的日志记录,以跟踪生成报告时发生的情况。但我没有看到任何错误或可疑的东西。
它只是溜走了,没有留下任何痕迹。答案是
视情况而定
。。。
通常,当您想要启动任务并控制它时,您可以使用
await Task.Run(() => ScheduleMassReportGeneration(report));
但在您的案例中,报告生成似乎是CPU密集型的,在这种情况下,将工作
委托给任务可能不会带来好处,因为在生成报告时无法执行任何操作。
如果报告可以并行处理,则可以为每个报告创建任务,并最终等待所有报告完成:
var tasks = reportCollection.Where(r => r.Status != Completed)
.Select(r => Task.Run(() => ScheduleMassReportGeneration(r)))
.ToArray();
Task.WaitAll(tasks);
编辑1
服务快速启动和结束的原因是,它完成了预期的一切。它只是创建任务,然后完成。谢谢@Tomas,但需要在异步操作之前执行1个sp。我只是为了更好地理解而编辑了我的问题。