私は2つのリストボックスを持っています.1つはマスター、もう1つは子です。マスター上でインデックスが変更されると、子リストボックスはマスタに関するレコードで適切に埋められます。あるマスターがすべてのレコードを取得するのに長い時間がかかり、レコードの取得が完了する前に、ユーザーが入力する時間がかかりにくい別のマスターをクリックすると、問題が発生しています。何が起こるのかは、最終的に、ユーザーがそのマスターにもういなくても、子リストボックスを長く取っていたマスターがいっぱいになります。winformsのワーカースレッドをキャンセルする
私は、塗りつぶしに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;
}
だがについて何らかの理由で、完了した作業者のコードが引き続き呼び出されます。作業者が完了したコードは次のとおりです。
このスレッドの返信をキャンセルするには何か他に何かありますか?
CancellationPendingは、BackgroundWorkerではなく、DoWorkEventArgsに公開されています。この例ではのパラメータになります。 –
Sherlock