gpt4 book ai didi

c# - 取消任务队列中正在执行的任务

转载 作者:行者123 更新时间:2023-12-03 13:14:47 25 4
gpt4 key购买 nike

我有一个需要顺序处理的项目列表(但是在单独的工作线程上,以便维护UI响应性)。需要注意的重要一点是,这些项目可以运行很长时间(5-10秒)。

Task<bool> currentTask = null;

foreach (var item in items)
{
var currentItem = item;

// Add a new task to the sequential task queue
if (currentTask == null)
currentTask = Task.Factory.StartNew<bool>(() =>
{
return currentItem.ProcessItem();
}, processCancelTokenSource.Token);
else
currentTask = currentTask.ContinueWith<bool>(t =>
{
return currentItem.ProcessItem();
}, processCancelTokenSource.Token);

// Update UI after each task completes
currentTask.ContinueWith(t =>
{
if (t.IsCanceled)
currentItem.State = State.Cancelled;
else
{
if (t.Result)
currentItem.State = State.Complete;
else
currentItem.State = State.Failed;
}
},TaskScheduler.FromCurrentSynchronizationContext());
}

现在,我正在使用 CancellationToken取消队列的处理(有一个“取消处理”按钮)。

问题在于这不会取消当前正在执行的任务。如果调用 CancellationTokenSource.Cancel(),那么将取消队列中等待执行的所有任务,并且将其项目的 currentItem.State设置为 State.Cancelled,这是正确的。问题在于,取消时正在执行的任务将继续执行,直到完成为止,然后将其设置为 State.CompleteState.Failed。这不理想,原因有两个:(1)取消后任务仍在运行;(2)由于 State.Cancelled不为真,因此状态未设置为 t.IsCanceled

我有办法安全地取消/停止当前正在执行的任务吗?

最佳答案

任务支持优美的取消模式。 CancellationToken只是一个 token 。它不会中断任何正在执行的代码或中止线程。您应该自己在任务正文中检查此 token 。

需要记住的一点是:如果要取消当前任务,请通过 CancellationToken.ThrowIfCancellationRequested 方法取消它,而不仅仅是从任务主体中退出。

关于c# - 取消任务队列中正在执行的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12403907/

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