取消ThreadPool . queueuserworkitem任务

本文关键字:任务 queueuserworkitem ThreadPool 取消 | 更新日期: 2023-09-27 18:11:11

我需要取消使用ThreadPool.QueueUserWorkItem(…)启动的后台任务。我知道BackgroundWorker有专门用于这种事情的构造,但我认为在这种情况下它是多余的,因为没有涉及用户界面。通过取消,我只是指强制完成回调方法。

向我的类中添加如下内容有哪些缺陷?

// Cancellation Property.
private bool _canceled;
public bool CancelTask
{
    get { return _canceled; }
    set { _canceled = value; }
}
public void DoSomeTask()
{
    int iterations = 50;
    ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadPoolCallback), iterations);
}
private void ThreadPoolCallback(object state)
{
    if (_canceled)
        return; // don't even start.
    int iterations = (int)state;
    for (int i = 0; !_canceled && i < iterations; i++)
    {
        //
        // do work ...
        //
        // This allows you to cancel in the middle of an iteration...
        if (_canceled)
            break;
    }
}

有更好的方法吗?

取消ThreadPool . queueuserworkitem任务

我将使用方法CancelTask()而不是属性。关键是调用者应该能够取消任务,但没有人应该能够取消任务。

然后,您需要确保_cancelled的读和写具有适当的内存屏障,否则一个线程可能永远不会观察到另一个线程所做的更改。为此,我将使用线程。VolatileWrite(在CancelTask内部)和Thread。挥发性读取(在你的循环内)