1

我正在将我们的 DAL 更改为async DAL。

看着 :

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

我看到有一种async打开连接的方法。但是为什么没有关闭连接的异步方法?

  • 共享连接可能被其他人使用
  • 可能返回连接池
  • 这是一个 I/O 操作
  • 可能的延迟/耗时操作

(我可能对以上四个都错了:-))

问题

(对我来说)应该有async close一种连接方法似乎是合乎逻辑的。

有没有理由?

PS 我显然会在最后使用 DAPPER,但只是为了练习,我决定创建类似于 DAL 的小型迷你迷你 dapper。

4

2 回答 2

4

共享连接可能被其他人使用

为什么这会使调用 close 需要很长时间?如果这意味着,在其他人仍在使用连接的情况下,所有“关闭”都意味着您不再需要它,并且不需要关闭实际的底层连接。

这是一个 I/O 操作

不必要。正如您所说,如果它是池化/共享的,那么它只是返回到池中,根本不会发生 IO。

是什么让你认为,即使底层连接被关闭,也需要很长时间。需要做的就是停止关注连接,可能会通过连接发送一条礼貌消息,说你已经完成了。这不会需要很长时间。您无需等待对此类消息的任何类型的响应,因此您无需在此方法中等待完成的网络往返。

可能的延迟/耗时操作

为什么会很耗时?如果它被延迟(例如,如果连接被池化并且您在您是它的最后一个用户时关闭它),这意味着它可能会在一段时间后关闭,但您不需要等待那个

将一个对象标记为“不再使用”根本不费时间,而且在一天结束时,这就是你真正要做的。

于 2015-07-01T19:58:59.997 回答
2

事实上,IDbConnection接口(开发 ADO.NET 连接提供程序以及其他接口(如 )需要实现的接口IDbCommand)不提供OpenAsync.

因此,OpenAsync它是 的实现细节DBConnection,例如,它是System.Data.SqlClient.SqlConnection.

为什么没有CloseAsync这应该向 .NET Framework 开发团队成员询问。当有这样的设计决策时,通常是因为框架本身或由 Microsoft 或某些合作伙伴开发的某些基于 .NET 的解决方案中的某些特定要求而激发的。也许这里有一个潜在的问题:为什么IDbConnection不定义这两种风格OpenClose异步风格? 为了避免对现有代码的破坏性更改,接口怎么样?IDbConnectionAsync.

顺便说一句,我怀疑打开一个连接比关闭它消耗更多的时间,因为关闭过程可以排队,因为调用者只是希望一个 OK 我会(从数据库服务器)在打开连接时这样做,这不仅是信号,而且是立即可用连接本身。

由于网络连接可能会减慢连接打开过程,这似乎是将其实现为异步操作的主要原因。

于 2015-07-01T19:59:43.623 回答