1

かなりのデータベース作業を行う Winforms アプリケーションがあります。多くの読み取りとレコードの挿入を行います。データベースのサイズによっては、操作に最大 30 秒から 1 分かかる場合があります。現在、私のプログラムは問題なく動作しています。

私の問題は、プログラムがこれを実行している間、データベースの処理が完了するまで UI スレッドがブロックされることです。データベース関数をスレッドに入れたいのですが、この MSDN の記事によると、ADO.NET はスレッドセーフではありません。

UI にプログレス バーを表示する方法や、「ADO.NET はスレッド セーフではありません」を回避する方法はありますか? たぶん、継承する独自のクラスを作成するSqlDataReaderSqlConnection、スレッドセーフにするためです。これは可能ですか?

4

1 に答える 1

3

バックグラウンドワーカーを使用して、各スレッド (bgw) が独自の Connection オブジェクトを作成するようにしてください。

リンクされた記事に関しては、キーを生成する同時実行セーフな方法があることを確認してください。データベースにそれらを生成させることが最良のオプションです。

UI にプログレス バーを表示する方法はありますか

それはトリッキーです。Bgw は ReportProgress を問題なく実行できますが、実行中のクエリから取得するのは問題です。行の総数でさえ、通常は最後にしかわかりません。
しかし、いつでもそれを偽造することができます.ユーザーは気に/知りません.

于 2012-09-19T21:05:45.230 に答える