gpt4 book ai didi

c# - 取消时延续链中的哪个任务正在运行?

转载 作者:太空宇宙 更新时间:2023-11-03 16:06:07 24 4
gpt4 key购买 nike

我有一个 Task 的延续链,可以在超时发生后取消。我想确定取消发生时哪个任务正在运行。这就是我要说的:

CancellationTokenSource cts = new CancellationTokenSource();

Task timeoutTask = Task.Delay(5000).ContinueWith((t) => cts.Cancel());

Task workChain = Task.Factory.StartNew((t) =>
{
Console.WriteLine("Running task " + Task.CurrentId);
Thread.Sleep(1000);
}, -1, cts.Token);

Task parent = workChain;
for (int i = 0; i < 10; i++)
{
parent = parent.ContinueWith((t, o) =>
{
Console.WriteLine("Running task " + Task.CurrentId);
Console.WriteLine("Last Task.AsyncState = " + t.AsyncState);
Thread.Sleep(1000);
}, i, cts.Token, TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.Current);
}
parent.ContinueWith((t) =>
{
Console.WriteLine("Cancel task " + Task.CurrentId);
Console.WriteLine("Last running Task.AsyncState = " + t.AsyncState);
}, TaskContinuationOptions.OnlyOnCanceled);

当我运行上面的代码时,传递给 OnlyOnCanceled 的先行项不是在事情被取消时正在运行的任务。我知道原因:OnlyOnCanceled 任务循环中创建的最后一个任务的父级,当超时发生时,所有未完成的任务都被标记为已取消正在启动。

让每个任务检查 token 的状态并在其他地方存储一些东西在大多数情况下是有效的,但在一个任务完成后下一个任务开始之前取消的可能性很小。在那种情况下,我找不到关于第一个取消任务的任何信息。我总是可以在任务开始时存储一些东西,在任务取消时存储其他东西,但这很快就会让人感觉很笨拙。

最佳答案

让每个可能正在运行的任务记录它开始或停止执行。 TPL 不记录哪些任务在何时运行。

关于c# - 取消时延续链中的哪个任务正在运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19300122/

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