15

System.Data.SqlClient.SqlCommand にはメソッドがあります

BeginExecuteNonQuery
BeginExecuteReader
BeginExecuteXmlReader

EndExecuteNonQuery
EndExecuteReader
EndExecuteXmlReader

非同期実行用。

System.Data.IDbCommand のみ

ExecuteNonQuery
ExecuteReader
ExecuteXmlReader

これは同期操作専用です。

非同期操作用のインターフェイスはありますか?
さらに、なぜ BeginExecuteScalar がないのですか?

4

8 に答える 8

3

実際、BeginExecuteNonQuery、EndExecuteNonQuery などと同等の非同期動作を作成するのはかなり難しい作業です。これらの API の実装は、単純に別のスレッドを生成し、データベースの応答を待ってコールバックを呼び出すよりもはるかに優れています。これらは I/O オーバーラップに依存しており、はるかに優れたスレッド エコノミーを提供します。ネットワーク ホップ、コマンドのデータベース処理の間、追加のスレッドは消費されません。これは、呼び出しに費やされる全体の時間のおそらく 99% です。数回の呼び出しでは違いはありませんが、高スループット サーバーを設計する場合、スレッド エコノミーが非常に重要になります。

なぜ BeginExecuteScalar が欠落しているのか疑問に思っていました。また、ODP.Net などの他のほとんどのプロバイダーには、非同期 API がまったくありません。

はい、非同期操作用のインターフェイスはありません。

于 2012-04-20T04:38:44.707 に答える
1

「1 つの値」を取得している場合でも、ほとんどの時間は 1) データベース サーバーへのネットワーク ホップ、2) コマンドを実行するデータベース サーバーに費やされます。たとえば、1000 レコードをデータ セットに読み込むのに費やす時間よりもはるかに多くの時間がかかります。だから、私は同意します、BeginExecuteScalar がない理由は明らかではありません...

于 2012-04-20T04:46:53.973 に答える
-1

質問のように複雑ではないため、カスタムコードで非同期動作を実装できます-目標のための標準的な非同期操作はありません。

于 2012-02-02T12:04:04.027 に答える
-10

いいえ、それらのためのインターフェースはありません

が存在しない理由は、BeginExecuteScalar非常に迅速な単一の値を取得するために非同期呼び出しがおそらく必要ないためです。

于 2012-02-02T11:54:17.267 に答える