Уведомлять потребителей, когда все задачи выполнены, не блокируя поток - PullRequest
0 голосов
/ 13 декабря 2018

Учитывая приведенный ниже код, каков самый элегантный способ уведомить потребителей, когда все задачи завершены, не блокируя поток?В настоящее время у меня есть решение с использованием счетчика, который увеличивается до Execute(action) и уменьшается после Continuation() и LogException().Если счетчик равен нулю, можно с уверенностью предположить, что больше не выполняется никаких задач.

1 Ответ

0 голосов
/ 13 декабря 2018

Прежде всего, вообще не используйте конструктор Task.Если вы хотите запустить делегат в потоке пула потоков, используйте Task.Run.Далее, не используйте ContinueWith, используйте await, чтобы добавить продолжения к задачам.Таким образом, намного проще написать правильный код, особенно в отношении правильной обработки ошибок.Ваш код наиболее эффективно написан как:

try
{
    await Task.Run(() => Execute(action));
    Continuation();    
}
catch(Exception e)
{
    LogExceptions(e)
}
finally
{
    CustomLogging();
}
...