gpt4 book ai didi

c# - Task.WaitAny 的重载版本是否取消任务?

转载 作者:太空狗 更新时间:2023-10-29 21:49:25 27 4
gpt4 key购买 nike

int WaitAny(Task[] tasks, int millisecondsTimeout); 

上述方法是否在超时后取消任务?看起来没有,但 C# 70-483 考试引用书说这个重载版本取消了任务。这是一些测试代码,

Task longRunning = Task.Run(() =>
{
Thread.Sleep(10000);
});
int index = Task.WaitAny(new Task[] { longRunning }, 1000); // returns -1
index = 0; // reset it to reuse in the loop
while (index < 12)
{
Thread.Sleep(1000);
index++;
Console.WriteLine("long running task status {0}", longRunning.Status);
}

前几次,Status 为 Running,之后状态变为 RanToCompletion。那么那个超时与Task和WaitAny有什么关系呢?

最佳答案

Task.WaitAny 将在 (a) 它包装的任何任务完成或 (b) 超过超时时完成。如果超时,WaitAny 完成,但它包装的任务不会被取消。任务的取消往往是合作的而不是隐式的,并且将涉及 显式 CancellationToken 的传递。

如果您希望任务在超时后取消,您可以创建一个带有超时的 CancellationTokenSource 并将其传递到您正在等待的任务中:

 using(CancellationTokenSource cts=new CancellationTokenSource(TimeSpan.FromSeconds(5)))
{
var task = Task.Delay(TimeSpan.FromSeconds(10), cts.Token);
task.Wait();
}

当然,强烈不鼓励使用阻塞方法等待任务完成,就像在 Task.Run 中包装同步阻塞代码并期望一切正常工作和“异步”。

Embrace async/await为了胜利。

关于c# - Task.WaitAny 的重载版本是否取消任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33520145/

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