Информация об изменениях

Сообщение Re: Async worker with cleanup on worker exit от 28.02.2020 21:50

Изменено 29.02.2020 21:31 StatujaLeha

Re: Async worker with cleanup on worker exit
Здравствуйте, Jericho113, Вы писали:

Этот код не взлетит:
   // Вы передаете в Task.Run async-функцию, она завершится на первом await, tenantWorker запустится, но ожидания не будет.
   // Т.е. workerTask у Вас будет  сразу Completed, никаких 2-3 часов не пройдет.
   // Дальше сразу вызовется ContinueWith, Ваш await в нем смысла не имеет: Вы ждете на уже завершившейся таске.
   // Следующая операция - очистка словаря. 
   // Т.к. мы придем к ней почти сразу, а в Вашем коде нет гарантии, что удаление из словаря вызовется после добавления, 
   // то tenantId может остаться в словаре навечно.
   var workerTask = Task.Run(async()=> await tenantWorker.Run()) // может выполняться часа 2-3 или более
// код ниже подходит для того что бы корректно сделать пост процессинг и удалить воркер из глобального списка??? или я туплю крепко 
            .ContunueWith(async (parentThread)=>
                {
                                  await parentThread;  // дождаться завершения родителя ???
                                  allTenantWorkers.Remove(tenantid);  // удалить из списка выполняющихся воркеров когда он завершит работу
                                 },TaskContinuationOptions.RunContinuationsAsynchronously);

   allTenantsWorkers.Add(tenantId,workerTask);   // добавить воркера и тенант который он обрабатывает в список для исключения
Re: Async worker with cleanup on worker exit
Здравствуйте, Jericho113, Вы писали:

Этот код не взлетит:
   // Если по каким-то причинам workerTask у Вас отработает очень быстро и будет почти сразу Completed,
   // то ContinueWith может быть вызван также почти сразу.
   // Операция в нем - очистка словаря. 
   // Т.к. мы можем прийти к ней почти сразу, то получается, что удаление из словаря может быть выполнено до добавления. 
   // В случае реализации это сценария tenantId останется в словаре навечно.
   var workerTask = Task.Run(async()=> await tenantWorker.Run()) // может выполняться часа 2-3 или более
// код ниже подходит для того что бы корректно сделать пост процессинг и удалить воркер из глобального списка??? или я туплю крепко 
            .ContunueWith(async (parentThread)=>
                {
                                  await parentThread;  // дождаться завершения родителя ???
                                  allTenantWorkers.Remove(tenantid);  // удалить из списка выполняющихся воркеров когда он завершит работу
                                 },TaskContinuationOptions.RunContinuationsAsynchronously);

   allTenantsWorkers.Add(tenantId,workerTask);   // добавить воркера и тенант который он обрабатывает в список для исключения