私はこれについてリッカに同意しません。非同期DBコマンドは優れているだけでなく、規模、スループット、およびスループットを達成するために重要です。 レイテンシー。スレッドプールの立ち上げ時間に関する彼の反対意見は、トラフィック量が少ないWebサーバーにのみ当てはまります。
トラフィックが多い状況(重要なのはこれだけです)では、スレッドプールは新しいスレッドの「注入」を待つ必要はありません。 SQLコマンドを非同期で実行することは、Webサーバーの要求/スレッドの状態の観点からだけでなく、要求の存続期間/待機時間の合計の観点からも重要です。相関のないDB呼び出しは、順次ではなく並列で実行できます。これだけでも、通常、ユーザーが経験するHTTPリクエストのレイテンシが劇的に改善されます。つまり、ページの読み込みが速くなります。
ただし、アドバイス:非同期処理=true
接続文字列。これは設定されていませんが(デフォルトでは設定されていません。編集:.NETFramework<4.5以降。非同期処理
不要になりました
BeginExecuteReader
偽物に過ぎないので、呼び出しはスレッドを起動し、それをブロックします。 スレッド。真の非同期処理が接続文字列で有効になっている場合 その場合、呼び出しは真に非同期であり、コールバックはIO完了に基づいています。
注意:非同期SQLコマンドは最初のとすぐに完了します 結果はクライアントに返され、情報メッセージは結果としてカウントされます。
create procedure usp_DetailsTagsGetAllFromApprovedPropsWithCount
as
begin
print 'Hello';
select complex query;
end
あなたは非同期のすべての利点を失いました。 print
クライアントに送り返される結果を作成します。これにより、非同期コマンドが完了し、クライアントでの実行が再開され、「reader.Read()」が続行されます。今それ 複雑なクエリが結果の生成を開始するまでブロックします。 '誰がprint
を置くかを尋ねます 手順で?' しかし、 print
他の何か、おそらく INSERT
のように無邪気な何かに偽装されている可能性があります なしで実行する 最初に SET NOCOUNT ON
を発行します
。