Установите ConfigureAwait (false) для всего проекта /dll

Согласно статье в MSDN Magazine, наилучшей практикой является "Использовать ConfigureAwait(false) когда сможете". Кроме того, в нем говорится: "Если вы можете использовать ConfigureAwait в какой-то момент в методе, я рекомендую вам использовать его для каждого ожидания в этом методе после этой точки". Стивен Клири, автор этой статьи, заявляет в своем блоге, что "в ваших асинхронных методах библиотеки используйте ConfigureAwait (false), где это возможно [выделение добавлено]".

Учитывая, что большинство или всех моих await в проекте библиотеки, которое должно широко использоваться, должно иметь .ConfigureAwait(false) возможно ли что-то сделать/изменить параметр, чтобы сделать его таким, чтобы поведение пользователя по умолчанию в моем проекте /dll не продолжать в захваченном контексте? То есть, чтобы я мог опустить все вызовы .ConfigureAwait(false) и вместо этого добавлять .ConfigureAwait( true ) только тогда, когда мне нужен контекст, который нужно сохранить.

Ответ 1

Нет, для этого нет выбора. Команда Microsoft рассматривала настройку компилятора или что-то в этом роде, но в итоге отказалась от нее.

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

Ответ 2

В настоящее время существует сторонняя библиотека, которая поддерживает это. Пакет ConfigureAwait.Fody Nuget позволяет использовать атрибут ConfigureAwait для обозначения класса, сборки или метода, так что все .ConfigureAwait(false) должны быть .ConfigureAwait(false). На странице проекта используется этот пример:

using Fody;

[ConfigureAwait(false)]
public class MyAsyncLibrary
{
    public async Task MyMethodAsync()
    {
        await Task.Delay(10);
        await Task.Delay(20);
    }

    public async Task AnotherMethodAsync()
    {
        await Task.Delay(30);
    }
}

Я сам этого не пробовал, но, учитывая то, что я знаю о работе над дополнениями Fody, это, безусловно, возможно.