重用BackgroundWorker,取消并等待它假设您有一个搜索文本框,并且有一个搜索算法附加到TextChanged事件,该事件与BackgroundWorker一起运行。如果文本框中出现新字符,我需要取消之前的搜索并重新运行。我尝试在主线程和bgw之间使用事件,来自上一个问题,但我仍然收到错误“当前忙碌,无法同时运行多个任务”BackgroundWorkerbgw_Search=newBackgroundWorker();bgw_Search.DoWork+=newDoWorkEventHandler(bgw_Search_DoWork);私有AutoResetEvent_resetEvent=newAutoResetEvent(false);privatevoidtxtSearch_TextChanged(objectsender,EventArgse){SearchWithBgw();}privatevoidSearchWithBgw(){//取消之前的搜索if(bgw_Search_Search).Is();//等待bgw完成,以便可以重用。_resetEvent.WaitOne();//将阻塞直到调用_resetEvent.Set()}//开始新的搜索bgw_Search.RunWorkerAsync();//错误“无法同时运行多个任务”}voidbgw_Search_DoWork(objectsender,DoWorkEventArgse){Search(txtSearch.Text,e);}privatevoidSearch(stringaQuery,DoWorkEventArgse){inti=1;while(i<3)//模拟搜索处理...{Thread.睡眠(1000);我++;如果(bgw_Search。CancellationPending){_resetEvent。放();//发出信号工人完成e.Cancel=true;返回;编辑以反映答案不要重用BackgroundWorker,创建一个新的:privatevoidSearchWithBgw(){if(bgw_Search.IsBusy){bgw_Search.CancelAsync();_resetEvent.WaitOne();//将阻塞直到调用_resetEvent.Set()bgw_Search=newBackgroundWorker();bgw_Search.WorkerSupportsCancellation=true;bgw_Search.DoWork+=newDoWorkEventHandler(bgw_Search_DoWork);}bgw_Search.RunWorkerAsync();当.WaitOne()调用结束时,工作线程实际上并没有结束。它正忙于从DoWork()返回并等待运行RunWorkerCompleted事件(如果有)的机会。这需要时间。没有可靠的方法来确保BGW以同步方式完成。阻塞IsBusy或等待RunWorkerCompleted事件运行将导致死锁。如果你真的只想使用一个bgw,那么你必须对请求进行排队。或者只是不要为小事出汗并分配另一个bgw。他们花费很少。如果旧的存在,则创建一个新的后台工作者privatevoidSearchWithBgw(){//取消之前的搜索if(bgw_Search.IsBusy){bgw_Search.CancelAsync();//等待bgw完成,以便可以重用。_resetEvent.WaitOne();//将阻塞直到调用_resetEvent.Set()BackgroundWorkerbgw_Search=newBackgroundWorker();bgw_Search.DoWork+=newDoWorkEventHandler(bgw_Search_DoWork);}//开始新的搜索bgw_Search(RunWorkerAs);//错误“无法同时运行多个任务”}另外我知道您放入了假代码,但您希望确保在代码正常完成时设置了_resetEvent。我认为您应该考虑不取消后台工作人员。如果请求被取消并且用户键入的速度比服务器返回查询的速度快,则他在完成键入之前不会看到建议。在这样的交互式场景中,最好显示用户输入后的响应。如果他记得的单词在您的建议列表中,您的用户就会知道他可以停止输入。当您的服务器繁忙时,它也更好,因为不是许多取消的请求,他们会花费一些但最终没有出现,实际上会使用更少的响应。我在(3d)渲染应用程序中遇到了类似的问题,初学者的错误是取消并重新渲染每个鼠标移动。这导致大量的计算和很少的交互式反馈。以上就是C#学习教程:复用BackgroundWorker,取消等待它共享的所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
