首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多线程windows服务停止工作

多线程windows服务停止工作
EN

Stack Overflow用户
提问于 2020-02-25 19:00:00
回答 1查看 52关注 0票数 0

我正在使用windows服务来生成报告,比如说大约2K的报告。我也在使用TPL来提高性能。我观察到,在本地机器上,它在40报告下工作良好,但在UAT上,它不能正常工作,它停止异常工作,windows服务状态为启动。系统事件查看器中没有事件日志条目(我假设我没有得到事件日志条目,因为服务状态是启动的,并且它不会异常终止)

这是我的代码块。

代码语言:javascript
复制
 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()方法()中编写了适当的日志记录,以跟踪生成报告时发生的情况。但我没有看到任何错误或可疑的东西。它只是悄悄地溜走而不留下任何痕迹。

EN

回答 1

Stack Overflow用户

发布于 2020-02-25 19:30:13

答案是it depends...

通常,当您想要启动任务并对其进行控制时,您可以使用

代码语言:javascript
复制
await Task.Run(() => ScheduleMassReportGeneration(report));

但在您的情况下,报告生成似乎是CPU密集型的,在这种情况下,将work委托给任务可能不会带来好处,因为在生成报告时没有什么可做的。

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

代码语言:javascript
复制
var tasks = reportCollection.Where(r => r.Status != Completed)
    .Select(r => Task.Run(() => ScheduleMassReportGeneration(r)))
    .ToArray();

Task.WaitAll(tasks);

Edit1

服务快速启动和结束的原因是它做了所有它期望做的事情。它只是创建任务,然后就完成了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60393070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档