我有两个列表框,一个是主人,另一个是孩子。当主节点上的索引发生变化时,子列表框会被与主节点相关的记录适当地填充。当一个主人需要很长时间才能获取所有记录并且在完成获取记录之前,用户单击另一个需要更少时间来填写的主人时,我的问题就出现了。最终会发生的情况是,即使用户不再在该主控上,花费更长时间的主控也会填充子列表框。
我一直在使用 BackgroundWorker 线程来进行填充。
bw_LoadAll.DoWork += new DoWorkEventHandler(bg_LoadAllWork);
bw_LoadAll.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bg_LoadAllWorkCompleted);
bw_LoadAll.WorkerSupportsCancellation = true;
我为 master 订阅了 SelectedIndexChanged 事件,并将 cancelled 设置为 true:
bw_LoadAll.CancelAsync();
这是 DoWork 方法中的代码:
List<object> s = Repository.Instance().LoadAll();
if (!bw_LoadAll.CancellationPending) {
e.Result = s;
} else {
e.Cancel = true;
}
但是由于某种原因,worker完成的代码不断被调用。这是工人完成的代码:
if (!e.Cancelled) {
ddl.DataSource = e.Result;
ddl.DisplayMember = "QuickName";
ddl.ValueMember = "ID";
}
我还需要做些什么来取消这个线程的返回吗?