0

有什么方法可以在没有cancelPending的情况下停止backgroundWorker线程?我有这样的代码:

    DoWorkFunction
    {
    if(worker.cancellationPending == true) return; //this works great but

    VeryLongTimeComputingFunc();//this function take a lot of time and if it starts i can't stop it with cancellationPending
    ...Do something
    }

即使它启动了VeryLongTimeComputingFunc(),有什么方法可以阻止工人吗?

4

2 回答 2

0

也许您可以在“VeryLongTimeComputingFunc”中触发“CancelWorker”事件,并在 EventHandler 中使用“worker.CancelAsync()”停止 BackgroundWorker。

这应该有效:

  class BackgroundClass
    {
    public event EventHandler CancelWorker;

    BackgroundWorker worker = new BackgroundWorker();

    BackgroundClass()
    {
        CancelWorker += new EventHandler(BackgroundClass_CancelWorker);
    }

    void BackgroundClass_CancelWorker(object sender, EventArgs e)
    {
        worker.CancelAsync();
    }

    void RunBackgroundWorker()
    {   
        worker.DoWork += (sender, args) =>
        {
            VeryLongTimeComputingFunction();
        };
    }

    void VeryLongTimeComputingFunction()
    {
        if (CancelWorker != null)
        {
            CancelWorker(this, new EventArgs());
        }
    }
}

这将要求您可以更改“VeryLongTimeComputingFunction()”中的某些内容

于 2013-06-07T11:20:30.967 回答
0

假设您无法在内部添加适当的取消支持VeryLongTimeComputingFunction,您最好的选择是保存对 BGW 线程的引用并调用Abort它。请记住,通常不建议这样做,因为它可能涉及混乱的清理。

为了安全起见,您应该ThreadAbortedException在 long 函数中捕获任何引发的内容。

private Thread bgThread;

void DoWorkFunction()
{
    bgThread = Thread.CurrentThread;
    try
    {
        VeryLongTimeComputingFunc();
    }
    catch (ThreadAbortedException e)
    {

        //do any necessary cleanup work.
        bgThread = null;
    }
}

void CancelBGW()
{
    if (bgThread != null)
    { 
        bgThread.Abort();
    }
}

根据调用的时间和方式,CancelBGW您可能还需要lock.bgThread

于 2013-06-07T11:55:16.110 回答