gpt4 book ai didi

c# - 任务未按预期取消

转载 作者:太空宇宙 更新时间:2023-11-03 21:20:11 25 4
gpt4 key购买 nike

我们得到了以下场景:

class Program
{
static void Main(string[] args)
{
// trigger the delayed function
trigger();

// cancel the running task.
_token.Cancel();

// keep window open ;-)
Console.ReadLine();

}

private static CancellationTokenSource _token = null;
private static async void trigger()
{
_token = new CancellationTokenSource();

try
{
// run task
await Task.Run(async () =>
{
// wait time
await Task.Delay(2500);

// we should be cancelled here !!
Console.WriteLine(string.Format("IsCancellationRequested={0}", _token.Token.IsCancellationRequested));
Console.WriteLine("SHOULD NOT HAPPEN");

}, _token.Token);
}
catch (TaskCanceledException)
{
}
}
}

IMO 预期的行为是任务的操作主要在处理完 Task.Delay(2500) 之后取消。

但是控制台正在打印:

IsCancellationRequested=True
SHOULD NOT HAPPEN

这感觉就像是一个错误。如果您将 CancellationToken 作为参数添加到 Task.Delay - 函数,它将按预期工作。

那么,如果任务中的函数使用 Task.Delay,您可能不知道如何处理取消?

最佳答案

.Net 中的取消是合作的。将 token 作为参数传递给 Task.Run 只会将 token 与返回的任务相关联。

要真正取消任务,您需要检查任务本身内部的 token 。如果您希望在延迟内取消任务,您需要将 token 传递给 Task.Delay 方法。否则你只能在延迟之前或之后检查 while:

await Task.Run(async () =>
{
_token.Token.ThrowIfCancellationRequested();
await Task.Delay(2500, _token.Token);
_token.Token.ThrowIfCancellationRequested();

Console.WriteLine(string.Format("IsCancellationRequested={0}", _token.Token.IsCancellationRequested));
Console.WriteLine("SHOULD NOT HAPPEN");

}, _token.Token);

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

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