扱うデータ件数が多くなってきたり、複雑な問い合わせをデータベースにさせると、だんだんレスポンスが悪くなり「UIが固まる」ことがよくあります。
それを防ぐためにADO.NET 1.xでは別スレッドで処理したりしていたのですが、ADO.NET 2.0とSqlServerの組み合わせでは「SQLの非同期実行」ができるようになっています。
これを効果的に使うことで、実行時間のかかるクエリを実行するときに「UIが固まる」ことがなくなります。
データの件数が増えてきたり、複雑な問い合わせをさせる機会が増える頻度に合わせて
mdbファイル(デプロイが簡単なので手放せない)→SqlServer
とアップサイズしていく訳ですが、特に「非接続型アクセス」を多用するスタイルでは「UIが固まる」頻度が高いです。
ともかく(応答なし)と出てしまうのはみっともないですし...
そこで本題
今回は「ExecuteNonQuery」の非同期化から
ADO.NET 2.0になって非同期実行用の「BeginExecuteNonQuery」と「EndExecuteNonQuery」が増えています。
「BeginExecuteNonQuery」で実行を開始して「EndExecuteNonQuery」で結果を拾います。
・非同期実行をするためには?
接続文字列に「async=true」を加えて接続すると非同期実行が使えます。
この状態でも同期実行用の「ExecuteNonQuery」は実行できます。(パフォーマンスは落ちますが...)
・非同期実行完了の検出
「BeginExecuteNonQuery」を実行すると結果が出た出ないにかかわらず、すぐに処理が戻ってきます。
ここが同期実行用の「ExecuteNonQuery」との大きな違いです。
同期実行の場合はデータベースの処理が完了しないと処理が戻ってきません。
処理が戻ってこない→UIの処理がされない→「UIが固まる」
となってしまう訳です。
逆に非同期実行ではそのようなことがない代わりにいつデータベース側で処理が終わったかわかりません。
したがって非同期実行完了の検出をしてあげる必要があります。
今回は一番処理が簡単そうな「ポーリング」で処理完了の検出を行うことにしました。