Многопоточный windows сервис перестает работать - PullRequest
0 голосов
/ 25 февраля 2020

Я использую сервис windows для создания отчета, скажем, около 2К. Я также использую 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:

Я понимаю, что при запуске задачи asyn c мне нужно написать что-то, чтобы подключить поток, чтобы я мог проверить состояние выполнения. Основываясь на приведенном выше коде, я не имею никакого контроля над ним, теперь он как сирота. Теперь я хотел бы взять это под контроль, чтобы я мог проверить, что происходит с этим потоком / задачей, и записать соответствующий статус в базу данных и повторно запустить эту задачу.

PS: Правильная регистрация записана в методе ScheduleMassReportGeneration() (), чтобы отслеживать, что происходит при создании отчета. Но я не видел никаких признаков ошибки или подозрительных вещей. Это просто ускользает, не оставляя никаких следов.

1 Ответ

0 голосов
/ 25 февраля 2020

Ответ it depends ... Обычно, когда вы хотите запустить задачу и иметь контроль над ней, вы можете использовать

await Task.Run(() => ScheduleMassReportGeneration(report));

Но кажется, что генерация отчетов в вашем случае требует интенсивной работы ЦП, и в таких случаях делегирование work для задачи могут не принести пользы, так как при создании отчета ничего нельзя сделать. Если отчеты являются чем-то, что может обрабатываться параллельно, то вы можете создать задачу для каждого отчета и в конце дождаться, пока все они завершатся sh:

var tasks = reportCollection.Where(r => r.Status != Completed)
    .Select(r => Task.Run(() => ScheduleMassReportGeneration(r)))
    .ToArray();

Task.WaitAll(tasks);

Edit1

Причина, по которой служба запускается и заканчивается быстро, заключается в том, что она делает все, что от нее требуется. Он просто создает задачи и затем завершается.

...