C# 取消winforms中的工作线程

C# 取消winforms中的工作线程,c#,winforms,multithreading,backgroundworker,C#,Winforms,Multithreading,Backgroundworker,我有两个列表框,一个是主人,另一个是孩子。当主服务器上的索引发生变化时,子列表框将适当地填充与主服务器相关的记录。我的问题是,当一个主控器需要很长时间才能获取所有记录,并且在它完成获取记录之前,用户单击另一个主控器,填充所需的时间就更少了。最终,花费更长时间的主机会填充子列表框,即使用户不再使用该主机 我一直在使用BackgroundWorker线程进行填充 bw_LoadAll.DoWork += new DoWorkEventHandler(bg_LoadAllWork); bw_LoadA

我有两个列表框,一个是主人,另一个是孩子。当主服务器上的索引发生变化时,子列表框将适当地填充与主服务器相关的记录。我的问题是,当一个主控器需要很长时间才能获取所有记录,并且在它完成获取记录之前,用户单击另一个主控器,填充所需的时间就更少了。最终,花费更长时间的主机会填充子列表框,即使用户不再使用该主机

我一直在使用BackgroundWorker线程进行填充

bw_LoadAll.DoWork += new DoWorkEventHandler(bg_LoadAllWork);
bw_LoadAll.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bg_LoadAllWorkCompleted);
bw_LoadAll.WorkerSupportsCancellation = true;
我订阅了主机的SelectedIndexChanged事件,并将Cancelled设置为true:

bw_LoadAll.CancelAsync();
以下是DoWork方法中的代码:

List<object> s = Repository.Instance().LoadAll();
if (!bw_LoadAll.CancellationPending) {
    e.Result = s;
} else {
    e.Cancel = true;
}

是否需要执行其他操作来取消此线程返回?

在do_work函数中,您需要检查工作线程上的CancellationPending,然后将DoWorkEventArgs.cancel变量设置为true

我已经有一段时间没有使用BackgroundWorker了,但是如果我的内存可用,当您调用
bw\u LoadAll.CancelAsync
时,除非LoadAllWork检查
bw\u LoadAll.CancelationPending
,否则您的
LoadAllWork
方法不会实际流产

确认人:“CancelAsync提交终止挂起后台操作的请求,并将CancellationPending属性设置为true

调用CancelAsync时,辅助方法有机会停止执行并退出。辅助代码应定期检查CancellationPending属性,以查看是否已将其设置为true。“


因此,在SelectedIndexChanged事件处理程序中,当调用
bw\u LoadAll.CancelAsync()
时,它将
bw\u LoadAll.CancelationPending
设置为true,但实际上并没有中止
LoadAllWork
方法。慢速加载程序仍将完成。

您的方法bg_LoadAllWork应定义为:

void bg_LoadAllWork(object sender, DoWorkEventArgs e)
{
    // Do your work here...
} 
在bg_LoadAllWork内部,您需要检查
e.CancellationPending
,如果为true,则设置
e.Cancel=true


最后一部分很重要-如果您从未设置e.Cancel,那么您的“e.Cancelled”将永远不会等于true。对CancelAsync的调用实际上并没有取消任何内容-更像是“请求后台工作自行取消”-您必须将逻辑设置到位以导致取消。

如果我在单击主项之间花费时间,但如果单击后再单击另一个主项,似乎没有及时安排好。我将更新代码以显示我在work方法中所做的操作。CancellationPending不会在DoWorkEventArgs上公开,而是在BackgroundWorker上公开,这将是本例中的参数。
void bg_LoadAllWork(object sender, DoWorkEventArgs e)
{
    // Do your work here...
}