gpt4 book ai didi

c# - 无法通过 CancellationTokenSource.Cancel() 取消任务

转载 作者:行者123 更新时间:2023-11-30 13:47:32 25 4
gpt4 key购买 nike

我无法停止任务。首先,我刚刚开始使用任务。以前,我一直使用 delegate.BeginInvoke() 在后台运行,但这次我需要停止后台执行,如果需要的话。所以我切换到任务。这是我的代码:

CancellationTokenSource token = new CancellationTokenSource();
Task posting = Task.Factory.StartNew(() => DoPosting(docs, session), token.Token);
HttpRuntime.Cache[session.ToString() + "_token"] = token;
HttpRuntime.Cache[session.ToString() + "_task"] = posting;

这是 ASP.NET MVC,所以我将持久的东西存储在 HttpRuntime.Cache 中。用户可以通过此操作取消操作:

public JsonResult StopPosting(string session)
{
CancellationTokenSource token = (CancellationTokenSource)HttpRuntime.Cache.Get(session.ToString() + "_token");
Task posting = (Task)HttpRuntime.Cache[session.ToString() + "_task"];
token.Cancel();

return Json(new { Message = "Stopped!" });
}

现在,当这个 Action 第一次被击中时,没有任何反应。然后我第二次要求取消。现在,token.IsCancellationRequested 说“真”,所以 token.Cancel() 一定做了什么。但是发布。状态仍然是“正在运行”。它将保持这种状态直到完成,然后是“RunToCompletion”。

所以,我请求取消一个任务,但它没有被取消。

也许我做错了什么或者我遗漏了一些明显的东西,但我只是看不出/不明白为什么它不会取消。

也许有人可以解释一下?

问候。

最佳答案

取消 token 不会立即导致任务的委托(delegate)停止执行。支持它(就像通过线程通过 Abort 完成的那样)可能会导致各种不良情况,从对象没有被正确清理,由于执行在应该被执行的操作中途停止而违反不变量逻辑上观察为原子等

您需要做的是让正在执行的实际函数查看 CancellationToken 并定期验证它是否未被取消。除了将 token 传递给 StartNew 之外,您还需要将其传递给 DoPosting 方法。然后,该方法需要定期调用 token.ThrowIfCancellationRequested();,如果确实请求取消,则在方法中适合停止的位置。

参见 How do I cancel non-cancelable async operations?进一步阅读。

关于c# - 无法通过 CancellationTokenSource.Cancel() 取消任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16967304/

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