Правильное использование ConfigureAwait (false) при объединении задач - PullRequest
1 голос
/ 03 июля 2019

Итак, у меня есть метод, который объединяет задачи вместе, чтобы сделать работу

var tasks = new List<Task>();

tasks.Add(DoWorkAsync(1));
tasks.Add(DoWorkAsync(2));
tasks.Add(DoWorkAsync(3));
tasks.Add(DoWorkAsync(4));
tasks.Add(DoWorkAsync(5));
tasks.Add(DoWorkAsync(6));

await Task.WhenAll(tasks.ToArray());

Чтобы получить лучшую производительность / отзывчивость от этого метода, который я рассматривал, используя ConfigureAwait(false)

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

как правильно использовать ConfigueAwait(false) при сцеплении Tasks и нужно ли мне использовать ConfigureAwait для каждой отдельной задачи и / или мне нужно использовать его на Task.WhenAll

В качестве дополнительного вопроса ...

Действительно ли ConfigureAwait что-то делает (или улучшает производительность / скорость отклика), если нет кода, работающего после ожидания?

1 Ответ

2 голосов
/ 03 июля 2019

Хорошо, так что из комментариев и цепочки нескольких других вопросов вместе, я думаю, что я лучше понимаю, когда использовать configure await ...

Все нижеприведенные предложения предполагают, что ваша задача не должна возвращатьсяв вызывающую ветку.т. е. у вас есть действительный ConfigureAwait вариант использования

  1. ConfigureAwait настраивает ожидание, а не задачу - вам нужно использовать ConfigureAwait только в строке, где awaitused

    Из этого ответа: Использование ConfigureAwait (false) для задач, переданных в Task.WhenAll () завершается ошибкой

  2. Вам нужно использовать ConfigureAwait, даже если это последняя строка в методе

    Из этого ответа: Влияет ли Task.ConfigureAwait (false) в последней строке метода на что-либо?

  3. ConfigureAwait не нужно вызывать при использовании ContinueWith

    Из этого ответа: ConfigureAwait(false) при использовании ContinueWith

  4. Задачи, содержащиеся в Task.WhenAll, уже настроены с ConfigureAwait

    Также из этого ответа: Использование ConfigureAwait (false) для задач, переданных в Task.WhenAll () завершается ошибкой

В результате мой код выглядит так:

var tasks = new List<Task>();

tasks.Add(DoWorkAsync(1));
tasks.Add(DoWorkAsync(2));
tasks.Add(DoWorkAsync(3));
tasks.Add(DoWorkAsync(4));
tasks.Add(DoWorkAsync(5));
tasks.Add(DoWorkAsync(6));

await Task.WhenAll(tasks.ToArray()).ConfigureAwait(false);

К моему удивлению, кажется, что использование ConfigureAwait рекомендуется большинством сообщества, хотя когда речь заходит о Threading / async / await, об этом никогда не упоминается.

Дополнительная информация: Зачем мне мешать использовать Task.ConfigureAwait (continueOnCapturedContext: false);

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

...