我正在将一些旧的ASP.NET代码移植到.NET 4.5上。我习惯于以老式方式使用SqlConnection/SqlCommand/SqlDataReader。现在,我正在尝试使用异步原语来提高性能。
这是我打开连接的旧代码:
static DBWrapper Open(string connKey) {
string connStr = WebConfigurationManager.ConnectionStrings[connKey].ConnectionString;
SqlConnection c = new SqlConnection(connStr);
c.Open();
DBWrapper retVal = new DBWrapper();
retVal._c = c;
return retVal;
}
DBWrapper类只是SqlConnection的一个轻量级包装器,具有我需要的一些额外方法。
下面是我如何转换为新的异步样式:
static async Task<DBWrapper> Open(string connKey) {
string connStr = WebConfigurationManager.ConnectionStrings[connKey].ConnectionString;
SqlConnection c = new SqlConnection(connStr);
var v = c.OpenAsync();
DBWrapper retVal = new DBWrapper();
await v;
retVal._c = c;
return retVal;
}
基本上,在连接正在打开时,我可以同时创建一个新的DBWrapper对象。
我困惑的是这个函数到底表现得好还是不好。任务创建的开销和等待它的时间可能比创建一个新的DBWrapper对象所需的时间要多得多。无论是否使用async,我最终都会返回一个完全构建好的连接对象。
这是一个从数据库返回用户列表的方法:
List<MyUsers> getUsers() {
using(SqlCommand cmd ...) {
using(SqlDataReader reader ...) {
while(reader.Read() {
... Fill the list
}
}
}
我也可以将这个方法转换为异步风格:
我也可以将这个方法转换为异步风格:
while (await reader.ReadAsync())
... Fill the list
}
再一次,我没有看到任何性能提升。事实上,在第二个示例中,即使在等待ReadAsync()期间,我也不会同时执行任何其他操作。
这是正确的方法还是有更好的使用异步范例与数据库连接和查询的方法?
async
非常有用。请参见异步代码不是Async ASP.NET中的万能药。 - Stephen Cleary