2017-04-04 342 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服務器時獲得一個空閒線程,併爲狀態機節省一小筆開銷。

相關問題