任何缺点使用ExecuteReaderAsync从C#AsyncCTP
-
12-11-2019 - |
题
有一些文章,其中表示异步数据库中的电话都是不好的想法。网。
C#异步CTP,还有一个 System.Data.SqlClient.SqlCommand
扩展叫 ExecuteReaderAsync
.我有一些行动如下我的现有编码:
var connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["hubConnectionString"].ConnectionString;
using (var conn = new SqlConnection(connectionString)) {
using (var cmd = new SqlCommand()) {
cmd.Connection = conn;
cmd.CommandText = "sp$DetailsTagsGetAllFromApprovedPropsWithCount";
cmd.CommandType = System.Data.CommandType.StoredProcedure;
conn.Open();
var reader = cmd.ExecuteReader();
while (reader.Read()) {
//do the reading
}
conn.Close();
}
}
有几个操作的这样在我的代码。因此,我很具有思想上的转换那些异步.
但另一方面,我没有看到有多大的吸引力对这种做法有(也许我不是在寻找合适的方向,谁知道!).
那么,是否有任何的缺点使用这一新的异步编程模型在这里?
编辑:
假设我重构的代码如下:
public async Task<IEnumerable<Foo>> GetDataAsync() {
List<Foo> foos = new List<Foo>();
var connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["hubConnectionString"].ConnectionString;
using (var conn = new SqlConnection(connectionString)) {
using (var cmd = new SqlCommand()) {
cmd.Connection = conn;
cmd.CommandText = "sp$DetailsTagsGetAllFromApprovedPropsWithCount";
cmd.CommandType = System.Data.CommandType.StoredProcedure;
conn.Open();
var reader = await cmd.ExecuteReaderAsync();
while (reader.Read()) {
//do the reading
//create foos
}
conn.Close();
}
}
return foos;
}
因为我了解从等待着关键词,它把代码,其后,如继续下去。此外,当它的命在等待着关键词,它立即返回到它的呼叫者不论的操作状态。当它完成它回来和火继续代码。
这是我的想法。
解决方案
我不同意Ricka这一点。异步DB命令不仅是良好的,他们是重要的,在实现规模,吞吐量 和 延迟。他的反对有关的斜坡上时间线的游泳池只适用于一个网络服务器经验的低流量。
在一个高流量的状况(这是唯一的一个事项),该线的游泳池就不必等待'注入新的螺纹。做SQL异步命令是重要的,不仅从观点的网络服务器的请求/线的健康,而且还从观点的总要求终身/延迟:不相关的DB话可以在并行,而不是依次进行。这个单独的结果通常是在戏剧性的改进的延迟HTTP请求作为经验丰富的用户。换句话说,你的网页载更快。
一个字的意见:SQL命令不是真正的异步直到你使 Asynchronous Processing=true
在连接串。虽然这不是设定的(默认情况下是不是 编辑:开始与。净框架 < 4.5. Asynchronous Processing
不再需要)您的'异步'电话来 BeginExecuteReader
只不过是一个骗局,呼吁将启动一个线程和块 那 螺纹。当真正的异步处理启用 在连接串 那电话是真正的异步和回调是基于IO完成。
一个忠告:异步命令都是完成尽快 第一 结果返回到客户和信息的消息算的结果。
create procedure usp_DetailsTagsGetAllFromApprovedPropsWithCount
as
begin
print 'Hello';
select complex query;
end
你已经失去了所有的好处的异步.的 print
创建一种结果,即被送回的客户,完成异步命令和执行关于客户的简历,并继续与'的读者。Read()'.现在 那 将块,直到复查询,开始产生结果。你问问 '谁把 print
在这一程序?' 但 print
可以伪装成别的东西,也许是因为无辜看作一个 INSERT
执行 没有 第一发 SET NOCOUNT ON
.
其他提示
我注意到以下问题未得到回答:
所以,在这里使用这个新的异步编程模型是否有任何缺点?
缺点是非常微小的(次要的CPU /次memory AFAIK),因为await语句之后有可能运行的任何代码可能在单独的线程上运行,存在一个状态机以存储当前运行的线程的状态,以便在另一个线程上处理工作的继续。您可以了解有关等待/ async statemachine上的dixin博客 - 了解C#异步/等待(1)编译。