私は2つのリストボックスを持っています。1つはマスター、もう1つは子です。マスターのインデックスが変更されると、子リストボックスにはマスターに関連するレコードが適切に入力されます。私の問題は、1つのマスターがすべてのレコードを取得するのに長い時間がかかり、レコードの取得が完了する前に、ユーザーが別のマスターをクリックして、入力にかかる時間が短い場合に発生します。最終的には、ユーザーがそのマスターを使用していなくても、時間がかかっていたマスターが子リストボックスに入力されます。
私はBackgroundWorkerスレッドを使用して入力を行ってきました。
bw_LoadAll.DoWork += new DoWorkEventHandler(bg_LoadAllWork);
bw_LoadAll.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bg_LoadAllWorkCompleted);
bw_LoadAll.WorkerSupportsCancellation = true;
マスターのSelectedIndexChangedイベントをサブスクライブし、キャンセルをtrueに設定しました。
bw_LoadAll.CancelAsync();
DoWorkメソッドのコードは次のとおりです。
List<object> s = Repository.Instance().LoadAll();
if (!bw_LoadAll.CancellationPending) {
e.Result = s;
} else {
e.Cancel = true;
}
しかし、何らかの理由で、完了したワーカーのコードが呼び出され続けます。ワーカーが完成したコードは次のとおりです。
if (!e.Cancelled) {
ddl.DataSource = e.Result;
ddl.DisplayMember = "QuickName";
ddl.ValueMember = "ID";
}
このスレッドが戻るのをキャンセルするために他に何かしなければならないことはありますか?