我将DAL更改为async
DAL。
看着:
await _conn.OpenAsync().ConfigureAwait(false);
我发现有async
方法可以开放连接。但为什么关闭连接没有异步方法?
(我上面的四个可能都错了: - ))
问题
似乎逻辑(对我来说)应该是async close
连接方法。
有没有理由不存在?
PS我明显会在最后使用DAPPER,但仅仅是为了练习,我决定创建小型迷你小巧精致DAL。
答案 0 :(得分:3)
其他人可能会使用共享连接
为什么这会使呼叫接近它需要很长时间?如果这意味着什么,如果连接仍被其他人使用,那么"关闭"它表示您不再需要它,并且实际的基础连接不需要关闭。
这是一个I / O操作
不一定。正如你所说,如果它被汇集/共享,那么它只是返回到池中,根本不会发生IO。
是什么让你认为,即使基础连接被关闭,也需要很长时间。所有需要发生的事情就是停止关注连接,可能通过连接发送礼貌信息表示你已经完成了。这不会花费很长时间。您不需要等待任何类型的响应到这样的消息,因此您不会等待此方法中完成的网络往返。
可能延迟/耗时的操作
为什么要耗费时间?如果它被延迟(例如,如果连接被合并,并且当你是它的最后一个用户时你正在关闭它),这意味着它可能会在一点之后被关闭,但你不需要等待。
将对象标记为"不再使用"根本不是耗费时间,并且在一天结束时,你所做的一切都是真的。
答案 1 :(得分:2)
实际上,IDbConnection
接口(实现开发ADO.NET连接提供程序以及IDbCommand
等其他接口所需的接口)不提供OpenAsync
。
因此,OpenAsync
是DBConnection
的实现细节,例如,它是System.Data.SqlClient.SqlConnection
的基类。
为什么没有CloseAsync
?应该向.NET Framework开发团队成员询问。当有这样的设计决策时,通常它的动机是因为框架本身或Microsoft或某些合作伙伴开发的某些基于.NET的解决方案中的某些特定要求。也许这里有一个潜在的问题:为什么IDbConnection
没有定义Open
和Close
异步风格? IDbConnectionAsync
怎么样?界面,以避免与现有代码发生重大变化?。
由于网络连接可能会降低连接打开过程,因此这似乎是将其作为异步操作实现的主要原因。