我有一个Task
s 的连续链,例如,在发生超时后可能会被取消。我想确定取消发生时正在运行的任务。这就是我所说的:
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
任务是循环中创建的最后一个任务的父级,并且当发生超时时,所有未完成的任务都被标记为已取消而不启动。
让每个任务检查令牌的状态并将某些内容存储在其他地方大部分时间都可以工作,但是在一个任务完成之后在下一个任务开始之前取消发生的可能性很小。在那种情况下,我没有发现任何关于第一个取消任务的信息。当任务开始时,我总是可以存储一些东西,如果它被取消,我总是可以存储一些东西,但这很快就开始感觉很笨拙。