【问题标题】:Why there's no `DBconnection.CloseAsync()` while there is `DBconnection.OpenAsync()`?为什么有 `DBconnection.OpenAsync()` 却没有`DBconnection.CloseAsync()`?
【发布时间】:2015-09-19 03:22:03
【问题描述】:

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

正在看:

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

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

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

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

问题

(在我看来)应该有一个async close 连接方法似乎是合乎逻辑的。

有没有原因?

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

【问题讨论】:

  • 你指的是哪个具体的DBConnection
  • @i3arnon 这有关系吗? SqlConnection 类继承 dbconnection。我的 DAL 应该尽可能通用:i.imgur.com/DE4tsP6.png
  • 这很重要,因为DBConnection 中的默认实现实际上并不是异步的。然而,在SqlConnection 中,确实如此。

标签: c# asynchronous ado.net async-await dbconnection


【解决方案1】:

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

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

这是一个 I/O 操作

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

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

可能的延迟/耗时操作

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

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

【讨论】:

    【解决方案2】:

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

    因此,OpenAsyncDBConnection 的实现细节,例如,它是System.Data.SqlClient.SqlConnection 的基类。

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

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

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

    【讨论】:

    • @i3arnon 更正:它实现了IDbConnection
    • @i3arnon 我更新的文本是否更好地解释了这个问题?
    • 不这么认为。 IDbConnection 与问题无关,如已接受的答案所示,没有必要询问 .Net 团队。
    • @i3arnon 我不同意你的看法。即使关闭连接比关闭连接便宜,也可能会发生网络可能很慢并且发送关闭命令可能需要一些时间,所以也应该有一个CloseAsync...为什么没有CloseAsync at一切都是设计决策,可以由 MSFT 的 FW 开发人员来回答......
    • @i3arnon 关于IDbConnection 的事情。这是相关的,因为它表明即使打开连接仍然是可选的,它是DBConneciton 的实现细节。 OP 正在询问为什么有一个开放的异步而不是关闭的异步......好吧,因为这两种方法都不是合同强制要求的,所以实施者可能会根据自己的需要实施或不实施它们......
    猜你喜欢
    • 2014-09-15
    • 2011-05-03
    • 2015-01-11
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多