2017-04-04 83 views
0

我很困惑这个命令的行为:“await command.ExecuteReaderAsync()”在返回之前是否等待查询完成?

SqlDataReader reader = await command.ExecuteReaderAsync(CommandBehavior.SequentialAccess) 

我会非常喜欢的SQL服务器开始返回结果开始查询运行,并尽快,开始处理它们。这与等待SQL Server返回所有结果相反。看起来像这样可以在SQL Server Management Studio开始为我的查询返回结果时给出大约40%的加速计划。

它似乎应该是可能的,一些地方如this似乎表明它是。

我是新来async编程,但是,在我看来这样的命令调用的读者,分拆单独的线程来做到这一点,那么等待ExecuteReader完成,然后返回一个完成SQLDataReader

意味着命令是完全等同于这种无async

SqlDataReader reader = command.ExecuteReader(CommandBehavior.SequentialAccess) 

抑或从ExecuteReader返回SQLDataReader自然支持流,只有等待足够长的时间流可返回前?无论我是否拨打ExecuteReaderExecuteReaderAsync,它都可以工作吗?

在此先感谢!

+3

没有单独的线程,它只是在与数据库交谈的IO发生时阻塞当前线程。在执行后面的代码之前,它仍然会等待数据库返回。 'Async'主要是阻止线程阻止线程处理UI事件,或者避免使用可能处理新传入请求的被阻塞线程重载服务器。但是也可以在等待其他线程完成CPU绑定工作时使用它。 – juharr

+3

备注:post显示*正在执行查询的示例,但询问查询的结果*([NextResultASync] https://msdn.microsoft.com/zh-cn/library/hh223698(v = vs.110)的.aspx))。我不确定这是否是由于错误粘贴样本或误解数据如何查询造成的。 “返回”的用法可能会让人困惑,因为“异步”函数在第一次真正的“await”时立即返回... –

+0

您提供的链接无法回答您关于语义的问题吗?它演示了该方法的用法,并具体描述了如何将它用于流式传输结果。那你知道吗? – Servy

回答

0

然而,在我看来这样的命令调用的读者,分拆单独的线程来做到这一点,那么等待ExecuteReader完成,然后返回一个完成SQLDataReader

are wrong。什么async方法都应该做的是开始操作,“暂停”电流法的执行,释放当前线程,并且,后的操作变得可用,恢复状态机并调用其余的方法。

连接到SQL服务器是一种I/O操作,应该以异步模式运行,因为您并不需要.Net线程来执行此操作。连接打开后,同步和异步阅读器的行为将完全相同 - 与正常的.Net类相同。

与此方法的同步版本相比,您将在连接到SQL服务器时获得一个空闲线程,并为状态机节省一小笔开销。

相关问题