C# 多线程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

我正在使用windows服务生成报告,比如2K左右的报告。我还使用TPL来提高性能。我观察到,在本地机器上,它可以正常工作40次报告,但在UAT上,它不能正常工作2K,它停止工作异常,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()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。我只是为了更好地理解而编辑了我的问题。