为什么在有`DBconnection.OpenAsync()`时没有`DBconnection.CloseAsync()`?

时间:2015-07-01 19:43:40

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

我将DAL更改为async DAL。

看着:

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

我发现有async方法可以开放连接。但为什么关闭连接没有异步方法?

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

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

问题

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

有没有理由不存在?

PS我明显会在最后使用DAPPER,但仅仅是为了练习,我决定创建小型迷你小巧精致DAL。

2 个答案:

答案 0 :(得分:3)

  

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

为什么这会使呼叫接近它需要很长时间?如果这意味着什么,如果连接仍被其他人使用,那么"关闭"它表示您不再需要它,并且实际的基础连接不需要关闭。

  

这是一个I / O操作

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

是什么让你认为,即使基础连接被关闭,也需要很长时间。所有需要发生的事情就是停止关注连接,可能通过连接发送礼貌信息表示你已经完成了。这不会花费很长时间。您不需要等待任何类型的响应到这样的消息,因此您不会等待此方法中完成的网络往返。

  

可能延迟/耗时的操作

为什么要耗费时间?如果它被延迟(例如,如果连接被合并,并且当你是它的最后一个用户时你正在关闭它),这意味着它可能会在一点之后被关闭,但你不需要等待

将对象标记为"不再使用"根本不是耗费时间,并且在一天结束时,你所做的一切都是真的。

答案 1 :(得分:2)

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

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

为什么没有CloseAsync应该向.NET Framework开发团队成员询问。当有这样的设计决策时,通常它的动机是因为框架本身或Microsoft或某些合作伙伴开发的某些基于.NET的解决方案中的某些特定要求。也许这里有一个潜在的问题:为什么IDbConnection没有定义OpenClose异步风格? IDbConnectionAsync怎么样?界面,以避免与现有代码发生重大变化?

BTW,我怀疑打开一个连接比关闭它所花费的时间更多,因为关闭进程可以排队,因为调用者只需要一个 OK我会这样做(来自数据库服务器)一个连接它不仅仅是信令,而是连接本身的即时可用性。

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