为什么没有 `DBconnection.CloseAsync()` 而有 `DBconnection.OpenAsync()`?
Why there's no `DBconnection.CloseAsync()` while there is `DBconnection.OpenAsync()`?
我正在将我们的 DAL 更改为 async
DAL。
正在查看:
await _conn.OpenAsync().ConfigureAwait(false);
我看到有一个 async
方法用于打开 connection.But 为什么没有用于 关闭 连接的异步方法?
- 共享连接可能被其他人使用
- 可能return到连接池
- 这是一个I/O操作
- 可能延迟/耗时的操作
(以上四个我可能都错了:-))
问题
在我看来,应该有一个 async close
连接方法是合乎逻辑的。
为什么没有?
PS我显然会在最后使用 DAPPER,但只是为了练习,我决定创建类似 DAL 的小型 mini dapper。
A shared connection might used by others
为什么这会使关闭它的调用花费很长时间?如果这意味着什么,在其他人仍在使用连接的情况下,所有 "closing" 这意味着表明您不再需要它,并且不需要关闭实际的底层连接。
It is an I/O operation
不一定。正如你所说,如果它是pooled/shared,那么它只是返回到池中,根本不会发生IO。
是什么让您认为,即使正在关闭底层连接,也需要很长时间。所需要做的就是停止关注连接,可能会通过连接发送一条礼貌的消息,说你已经完成了。这不会花很长时间。您不需要等待对此类消息的任何类型的响应,因此您无需等待此方法中完成的网络往返。
Possible delayed / time-consuming operation
为什么会很费时间?如果它被延迟(例如,如果连接被合并并且当你是它的最后一个用户时你正在关闭它)这意味着它可能会在一段时间后关闭,但是 你不需要等待.
将对象标记为 "no longer in use" 并不费时,而且在一天结束时,这就是您真正要做的。
事实上,IDbConnection
接口(开发 ADO.NET 连接提供程序以及 IDbCommand
等其他接口所需的接口)不提供 OpenAsync
.
因此,OpenAsync
是 DBConnection
的实现细节,例如,它是 System.Data.SqlClient.SqlConnection
的基础 class。
为什么没有 CloseAsync
? 这应该问 .NET Framework 开发团队成员。当出现这样的设计决策时,通常是出于框架本身或 Microsoft 或某些合作伙伴开发的某些基于 .NET 的解决方案中的某些特定要求。也许这里有一个潜在的问题:Why IDbConnection
doesn't define both Open
and Close
asynchronous flavors? What about an IDbConnectionAsync
接口以避免对现有代码进行重大更改?。
顺便说一句,我怀疑打开一个连接比关闭它消耗更多的时间,因为关闭过程可以排队,因为调用者只需要一个 好的,我会做的(来自数据库服务器)在打开连接时,它不仅发出信号,而且连接本身立即可用。
由于网络连接可能会减慢连接打开过程,这似乎是将其实现为异步操作的主要原因。
我正在将我们的 DAL 更改为 async
DAL。
正在查看:
await _conn.OpenAsync().ConfigureAwait(false);
我看到有一个 async
方法用于打开 connection.But 为什么没有用于 关闭 连接的异步方法?
- 共享连接可能被其他人使用
- 可能return到连接池
- 这是一个I/O操作
- 可能延迟/耗时的操作
(以上四个我可能都错了:-))
问题
在我看来,应该有一个 async close
连接方法是合乎逻辑的。
为什么没有?
PS我显然会在最后使用 DAPPER,但只是为了练习,我决定创建类似 DAL 的小型 mini dapper。
A shared connection might used by others
为什么这会使关闭它的调用花费很长时间?如果这意味着什么,在其他人仍在使用连接的情况下,所有 "closing" 这意味着表明您不再需要它,并且不需要关闭实际的底层连接。
It is an I/O operation
不一定。正如你所说,如果它是pooled/shared,那么它只是返回到池中,根本不会发生IO。
是什么让您认为,即使正在关闭底层连接,也需要很长时间。所需要做的就是停止关注连接,可能会通过连接发送一条礼貌的消息,说你已经完成了。这不会花很长时间。您不需要等待对此类消息的任何类型的响应,因此您无需等待此方法中完成的网络往返。
Possible delayed / time-consuming operation
为什么会很费时间?如果它被延迟(例如,如果连接被合并并且当你是它的最后一个用户时你正在关闭它)这意味着它可能会在一段时间后关闭,但是 你不需要等待.
将对象标记为 "no longer in use" 并不费时,而且在一天结束时,这就是您真正要做的。
事实上,IDbConnection
接口(开发 ADO.NET 连接提供程序以及 IDbCommand
等其他接口所需的接口)不提供 OpenAsync
.
因此,OpenAsync
是 DBConnection
的实现细节,例如,它是 System.Data.SqlClient.SqlConnection
的基础 class。
为什么没有 CloseAsync
? 这应该问 .NET Framework 开发团队成员。当出现这样的设计决策时,通常是出于框架本身或 Microsoft 或某些合作伙伴开发的某些基于 .NET 的解决方案中的某些特定要求。也许这里有一个潜在的问题:Why IDbConnection
doesn't define both Open
and Close
asynchronous flavors? What about an IDbConnectionAsync
接口以避免对现有代码进行重大更改?。
顺便说一句,我怀疑打开一个连接比关闭它消耗更多的时间,因为关闭过程可以排队,因为调用者只需要一个 好的,我会做的(来自数据库服务器)在打开连接时,它不仅发出信号,而且连接本身立即可用。
由于网络连接可能会减慢连接打开过程,这似乎是将其实现为异步操作的主要原因。