我对此命令的行为感到困惑:
SqlDataReader reader = await command.ExecuteReaderAsync(CommandBehavior.SequentialAccess)
理想情况下,我希望启动查询运行,一旦SQL Server开始返回结果,就开始处理它们。这与等待SQL Server返回所有结果相反。当SQL Server Management Studio开始返回我的查询结果时,似乎可以将我的程序加速大约40%。
似乎应该可以,this等某些地方似乎表明它是。
我是async
编程的新手,但是,在我看来,这个命令正在调用读者,旋转一个单独的线程来执行它,然后等待ExecuteReader
到完成,然后返回完成的SQLDataReader
。
意味着命令完全等同于没有async
:
SqlDataReader reader = command.ExecuteReader(CommandBehavior.SequentialAccess)
或者从SQLDataReader
返回的ExecuteReader
自然是否支持流式传输并且只等待足够长的时间才能使流在返回之前可用?无论我是否致电ExecuteReader
vs ExecuteReaderAsync
?
提前致谢!
答案 0 :(得分:0)
然而,在我看来,这个命令正在调用读者,旋转一个单独的线程来执行它,然后等待
ExecuteReader
完成,然后返回完成的SQLDataReader
。< / p>
你are wrong。 async
方法应该做的是开始操作,“暂停”执行当前方法,释放当前线程,以及在操作可用后,恢复状态机并调用方法的其余部分。
连接到SQL服务器是一种I / O操作,应该以异步模式运行,因为此操作实际上不需要.Net
线程。连接打开后,同步和异步阅读器的行为将与普通.Net
类完全相同。
与此方法的同步版本相比,您在连接SQL服务器时将获得一个空闲线程,并且状态机的开销很小。