Сообщение 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); // добавить воркера и тенант который он обрабатывает в список для исключения