后台工人类取消,设置取消待定标志但不退出

Nat*_*ath 1 c# backgroundworker request-cancelling

我叫obackgroundworker.CancelAsync(); 在一个后台工作者当前在另一个线程中做一些工作然后使用while(obackgroundworker.IsBusy == true)等待它在退出应用程序之前完成(如果用户在线程离开处理时改变主意并且我想要干净地关闭)

取消挂起的单位正确设置为true但线程没有退出,在工作线程中我有:

backgroundworker obackgroundworker = (backgroundworker)sender;
if (obackgroundworker.cancellationpending == true)
     e.cancel = true;              
Run Code Online (Sandbox Code Playgroud)

应检查取消是否待定,然后将取消的标志设置为true,我认为这也会导致线程实际终止...?或者,当检测到取消实际结束时,是否需要从线程调用其他函数?

我已经阅读了很多使用背景工作者的例子,并且没有报告任何问题.

资料来源:

http://www.albahari.com/threading/part3.aspx http://www.dotneat.net/2009/02/10/BackgroundworkerExample.aspx http://www.codeproject.com/KB/cpp/BackgroundWorker_Threads. ASPX

谢谢

Tho*_*que 9

设置e.Cancel为true不会停止执行BackgroundWorker,它只表示操作已被取消,以便您可以在RunWorkerCompleted事件中进行检查.您需要通过从DoWork事件处理程序返回来停止任务:

BackgroundWorker obackgroundworker = (BackgroundWorker)sender;
if (obackgroundworker.CancellationPending == true)
{
     e.Cancel = true;
     return;
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 5

不,只是设置属性不会导致线程终止.那时你应该从你的方法返回.例如,这是来自您的第一个链接的代码:

if (bw.CancellationPending) {
    e.Cancel = true;
    return;
}
Run Code Online (Sandbox Code Playgroud)

请注意return语句,以便方法完成.

当然,如果您是从堆栈深处的某个方法执行此操作,则需要确保调用者也知道终止等等 - 但通常对于后台工作线程,它是"顶级"方法,CancellationPending无论如何检查财产,所以通常只返回是好的.