タイトルはできるだけ具体的にするようにしました。基本的に、backgroundworker スレッド内で実行しているのは、次のようなコードです。
SqlConnection conn = new SqlConnection(connstring);
SqlCommand cmd = new SqlCommand(query, conn);
conn.Open();
SqlDataAdapter sda = new SqlDataAdapter(cmd);
sda.Fill(Results);
conn.Close();
sda.Dispose();
query は大規模で時間のかかるクエリを表す文字列で、conn は接続オブジェクトです。
私の問題は、停止ボタンが必要なことです。クエリがキャンセルされた後に残っている結果を保持したいので、バックグラウンドワーカーを殺しても意味がないことに気づきました。さらに、クエリが完了するまでキャンセルされた状態を確認することはできません。
私がこれまでに思いついたこと:
パフォーマンスに大きな影響を与えることなく、これを効率的に処理する方法を概念化しようとしています。
私の考えは、SqlDataReader を使用して一度にクエリ ピースからデータを読み取って、ボタンを介して GUI から設定できるフラグをチェックするための「ループ」を作成することでした。問題は、私が知る限り、データテーブルの Load() メソッドを使用できず、sqlcommand をキャンセルできることです。私が間違っている場合はお知らせください。そうすればキャンセルが少し楽になります。
私が発見したことに照らして、以下のようなことをした場合にのみ、クエリの途中でsqlcommandをキャンセルできることに気づきました(疑似コード):
while(reader.Read())
{
//check flag status
//if it is set to 'kill' fire off the kill thread
//otherwise populate the datatable with what was read
}
しかし、これは非常に非効率的で、コストがかかる可能性があるように私には思えます。これは、絶対にデータテーブルにある必要がある進行中の sqlcommand を強制終了する唯一の方法ですか? どんな助けでも大歓迎です!