2017-04-04 24 views
0

私は、このコマンドの動作について困惑している:"await command.ExecuteReaderAsync()"はクエリが終了するのを待ってから戻るか?

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

私は理想的なクエリの実行を開始するとすぐSQLサーバーが結果を返す開始して、それらの処理を開始したいと思います。これは、すべての結果がSQL Serverによって返されるのを待つのとは対照的です。これは、SQL Server Management Studioがクエリの結果を返すときに、プログラムを約40%高速化できるようです。

thisのようにいくつかの箇所があると思われるようです。

私はそのコマンドがExecuteReaderが、その後終了SQLDataReader返し、終了するのを待って、その後、それを行うには別のスレッドをスピンオフ、読者を呼び出しているようしかし、それは私には思える、asyncプログラミングに新たなんです。

SqlDataReader reader = command.ExecuteReader(CommandBehavior.SequentialAccess) 

それともSQLDataReaderExecuteReaderから返された自然ストリーミングをサポートし、のみ返す前に利用できるようにストリームのために十分な長待つん:?コマンドはasyncせずに、このとまったく同じであることを意味

ExecuteReaderExecuteReaderAsyncを呼び出すかどうかは問題ありませんか?

ありがとうございます!そのコマンドがExecuteReaderが、その後終了SQLDataReader返し、終了するのを待って、その後、それを行うには別のスレッドをスピンオフ、リーダーを呼んでいるよう

+3

別スレッドはありません.DBとの会話のIOが発生している間は、現在のスレッドをブロックしていません。それは、それに続くコードが実行される前にDBが戻るのを待ちます。 'Async'は、UIスレッドがUIイベントを処理できるようにスレッドをブロックしないこと、または新しい着信要求を処理できるブロックされたスレッドでサーバーをオーバーロードさせないことです。しかし、他のスレッドがCPUバインド作業を終了するのを待っているときにも使用できます。 – juharr

+3

サイドノート:postは*クエリの*実行*の例を示していますが、クエリの*結果の読み取りについて質問します([NextResultASync] https://msdn.microsoft.com/en-us/library/hh223698(v = vs.110).aspx))。これは誤って貼り付けられたサンプルやデータのクエリ方法の誤解が原因であるかどうかはわかりません。また、 'return 'の使用法は、' async'関数が最初の実際の 'await'ですぐに返るので混乱を招く可能性があります... –

+0

あなたが提供したリンクは、セマンティクスについてのあなたの質問に答えることができません。このメソッドの使用方法を示し、具体的にどのように使用して結果をストリーミングするかについて説明します。あなたは理解できませんか? – Servy

答えて

0

しかし、それは私には思えます。

あなたare wrong。何async方法を行うことになっていることは、に運転を開始「一時停止」現在のメソッドの実行、現在のスレッドを解放し、そして、後に操作が利用可能になると、ステートマシンを復元し、呼び出すです残りの方法。

SQLサーバーへの接続はI/O操作です。この操作に実際に.Netスレッドが必要ないため、非同期モードで実行する必要があります。接続が開いた後、同期リーダーと非同期リーダーの両方が正常に動作します - 通常の.Netクラスと同じです。

この方法の同期バージョンと比較すると、SQLサーバーに接続するときに空きスレッドが1つあり、ステートマシンに小さなオーバーヘッドがあります。

関連する問題