后台工作者上的退出功能.CancellationPending==true

本文关键字:CancellationPending true 功能 退出 工作者 后台 | 更新日期: 2023-09-27 18:24:29

我目前正试图让我的一个函数在backgroundworker.CancellationPending == true时自行取消。

我有一门课是这样的:

public class ImportPostManager
{
    public event ProgressChangedEventHandler ProgressChanged;
    protected virtual void OnProgressChanged(int progress)
    {
        if (ProgressChanged != null)
        {
            ProgressChanged(this, new ProgressChangedEventArgs(progress, null));
        }
    }
    public void DoSomeStuff()
    {
        while(something == true)
        {
            if(backgroundworker.CancellationPending) return; //Here's my problem
            //KeepDoingStuff and report progress
        }
    }
}

我从backgroundworker.DoWork()中的窗体调用函数,但如何让类侦听backgroundworker.CancellationPending?我不能在.DoWork()中执行,因为它看起来像这样:

void _progressDialog_DoWork(object sender, DoWorkEventArgs e)
{
    Managers.ImportPostManager.Instance.ProgressChanged += (s, pe) => dialog.ReportProgress(pe.ProgressPercentage, null, pe.ProgressPercentage.ToString() + "%);
    Managers.ImportPostManager.Instance.DoSomeStuff();
}

并且我不希望将后台工作者发送到函数CCD_ 5。有没有办法利用事件或其他东西来获得我想要的东西?我还没有找到任何东西可以解释如何以我能理解的方式。。。

后台工作者上的退出功能.CancellationPending==true

如果您对DoSomeStuff没有直接传递给工作者感到满意,并且假设它是阻塞的(看起来很公平),那么您最好的选择可能是向函数添加Func<bool>参数。

public void DoSomeStuff(Func<bool> ShouldCancel)
{
    while (whatever == whateverElse && !ShouldCancel())
    {
        // Do work
    }
}

然后您可以从DoWork处理程序调用它。

void _progressDialog_DoWork(object sender, DoWorkEventArgs e)
{
    Managers.ImportPostManager.Instance.ProgressChanged += (s, pe) => dialog.ReportProgress(pe.ProgressPercentage, null, pe.ProgressPercentage.ToString() + "%);
    Managers.ImportPostManager.Instance.DoSomeStuff(() => backgroundworker.CancellationPending);
}

每一次都会得到评估,生活会很好。

尽管如果你担心这种情况经常发生,但可能值得研究一种更高级的多线程形式,即使只是通过System.Threading.Tasks命名空间提供的。在那里,您将有更多的取消选项。但是,如果你正在寻找快速而简单的东西,添加该函数就可以了,而且它可以在多个上下文中工作,所以如果你将来选择不使用后台工作者,你的助手类就不会与它联系在一起。

当然,如果您没有使用BackgroundWorker.CancellationPending属性(或者,如果我没有记错的话,使用Cancel()方法)进行绑定,那么您可以更改该函数并签入CancellationToken,然后简单地针对它(或者更确切地说,针对它的CancellationTokenSource)调用Cancel()。这在某些方面并不理想,但如果你最终想搬到更先进的地方,就像我之前说的那样,那会更干净一些。当然,如果你现在设置了函数,你也可以很容易地将令牌分层在DoSomeStuff上,所以你不会永远根据你现在的选择来选择其中一个。

相关文章:
  • 没有找到相关文章