ConfigureAwait(false) с объектом ADO.Net SQLConnection
Я начал использовать ConfigureAwait(false)
со всеми асинхронными объектами sql.
connection.OpenAsync().ConfigureAwait(false);
cmd.ExecuteNonQueryAsync().ConfigureAwait(false);
Но я обеспокоен тем, будут ли какие-либо последствия этого подхода?
Поскольку это будет выполняться в пуле потоков, который является отдельным потоком, из которого он был создан, я не уверен в последствиях, если мы не запустим его в одном потоке.
Наше приложение - сервис wcf, который обрабатывает тысячи записей параллельно.
Если кто-то помогает идентифицировать бизнес-сценарии, где это может быть проблемой, это будет полезно.
Спасибо
1 ответ
Как правило, пока область асинхронных операций является автономной и независимой, вы должны использовать ConfigureAwait(false)
- и действительно, это может быть важно для сокращения накладных расходов и узких мест. Код библиотеки обычно не должен знать о контексте вызова. Однако потребляющий код (такой как winforms, MVC и т. Д.) Обычно должен возвращаться в соответствующий контекст, поэтому не должен использовать ConfigureAwait(false)
, Например:
async Task SomeUXCodeAsync() {
var data = await GetSomeDataAsync(); // note no ConfigureAwait(false)
// not shown: use "data"
}
async Task<Foo> GetSomeDataAsync() {
using(var conn = CreateConnection()) {
await conn.OpenAsync().ConfigureAwait(false);
...
int result = await cmd.ExecuteNonQueryAsync().ConfigureAwait(false);
...
return ...
}
}
Приведенный выше сценарий довольно типичен и распространен, но он более сложный, чем TransactionScope
пример из комментариев касается примеров, когда код, связанный с данными, возможно, должен знать, например, о контексте вызова. Но оставим в стороне нюанс: до тех пор, пока потребительский код помнит, что он не должен игнорировать контекст вызова, вы, как правило, окажетесь в нужном месте. Извините, это немного расплывчато и нечетко, но: к сожалению, это обычно так и происходит в контексте вызова.