簡體   English   中英

多線程窗口服務停止工作

[英]Multithreaded windows service stop working

我正在使用 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() method() 中編寫了適當的日志記錄以跟蹤生成報告時發生的情況。 但我沒有看到任何錯誤或可疑的跡象。 它只是溜走,不留任何痕跡。

答案是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

服務快速啟動和結束的原因是因為它完成了預期的所有操作。 它只是創建任務然后完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM