gpt4 book ai didi

c# - 取消 ThreadPool .QueueUserWorkItem 任务

转载 作者:行者123 更新时间:2023-11-30 22:34:41 26 4
gpt4 key购买 nike

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

在我的类(class)中添加类似以下内容的陷阱是什么?

// 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;
}
}

有没有更好的办法?

最佳答案

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

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

关于c# - 取消 ThreadPool .QueueUserWorkItem 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7731610/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com