Почему нет `DBconnection.CloseAsync()`, а есть `DBconnection.OpenAsync()`?

Я меняю наш DAL на async DAL.

Смотря на:

await _conn.OpenAsync().ConfigureAwait(false);

Я вижу, что есть async метод для открытого соединения. Но почему нет асинхронного метода для закрытия соединения?

  • Совместное подключение может использоваться другими
  • Может вернуться в пул соединений
  • Это операция ввода / вывода
  • Возможна отложенная / длительная операция

(Я могу ошибаться во всех четырех выше:-))

Вопрос

Кажется логичным (для меня), что должно быть async close метод для связи.

Есть ли причина, почему нет?

PS Я, конечно, в конце буду использовать DAPPER, но только для практики я решил создать небольшой мини-миниатюрный DAL.

3 ответа

Решение

Совместное подключение может использоваться другими

Почему это заставляет звонить близко, это занимает много времени? Во всяком случае, это будет означать, что в случаях, когда соединение все еще используется другими, все это "закрытие" означает, что оно вам больше не нужно, и фактическое базовое соединение не нужно закрывать.

Это операция ввода / вывода

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

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

Возможна отложенная / длительная операция

Почему это займет много времени? Если оно задерживается (например, если соединение объединено в пул, и вы закрываете его, когда последний раз его используете), это означает, что оно, вероятно, будет закрыто через некоторое время, но вам не нужно ждать этого.

Пометка объекта как "больше не используемого" просто не занимает много времени, и в конце концов это все, что вы действительно делаете.

По факту, IDbConnection интерфейс (тот, который требуется реализовать для разработки поставщика соединения ADO.NET вместе с другими интерфейсами, такими как IDbCommand) не обеспечивает OpenAsync,

Таким образом, OpenAsync это деталь реализации DBConnection и, например, это базовый класс System.Data.SqlClient.SqlConnection,

Почему нет CloseAsync ? Об этом следует попросить члена команды разработки.NET Framework. Когда есть такое дизайнерское решение, как правило, оно мотивируется из-за определенных требований либо в самой среде, либо в каком-либо решении на основе.NET, разработанном Microsoft или каким-либо партнером. Может быть, здесь есть потенциальный вопрос: почему IDbConnection не определяет оба Open а также Close асинхронные ароматы? Как насчет IDbConnectionAsync интерфейс, чтобы избежать критических изменений с существующим кодом?,

Кстати, я подозреваю, что открытие соединения занимает больше времени, чем закрытие, потому что процесс закрытия может быть поставлен в очередь, так как вызывающий просто ожидает ОК, я сделаю это (с сервера базы данных), при открытии соединения это не просто сигнализация, а немедленная доступность самого соединения.

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

По состоянию на 2019 год существуетDbConnection.CloseAsyncметод ; он был добавлен в .NET Standard 2.1 и .NET Core 3.0 вместе сIAsyncDisposableинтерфейс . Работа отслеживалась по выпуску GitHub 28596 .

Он возвращаетTask, а неValueTask, потому что это может быть сложнее, чем просто вернуть соединение в пул; например, может существовать работа, требующая связанного с ней ввода-вывода (например, откат транзакции или освобождение ресурсов на стороне сервера для временных таблиц или переменных).

Другие вопросы по тегам