Установите 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, это, безусловно, возможно.