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);
}
前几次,状态正在运行,之后状态更改为RanToCompletion。那么那个超时与Task和WaitAny有什么关系呢?
答案 0 :(得分:3)
Task.WaitAny
将完成。如果超时超时,WaitAny
完成,但它包装的任务将不会被取消。使用任务取消往往是合作而非隐含,并且将涉及 显式 传递CancellationToken
。
如果您希望在超时后取消任务,可以创建一个超时的CancellationTokenSource
并将其传递到您正在等待的任务中:
using(CancellationTokenSource cts=new CancellationTokenSource(TimeSpan.FromSeconds(5)))
{
var task = Task.Delay(TimeSpan.FromSeconds(10), cts.Token);
task.Wait();
}
当然,等待使用阻止方法完成的任务是高度不鼓励,就像在Task.Run
中包装同步阻塞代码并期望一切正常工作和&#34;异步&# 34 ;.
答案 1 :(得分:0)
如果你看这里:https://msdn.microsoft.com/en-us/library/dd235650(v=vs.110).aspx IT表示如果发生超时,waitAny将返回-1。这是你首先得到的结果。不是你的期望吗?
这意味着代码继续通过WaitAny,但并不意味着它正在等待的任务已被取消。
答案 2 :(得分:0)
那么那个超时与Task和WaitAny有关吗?
它什么都不做。当你设置10000的超时时,就像你说:
“嘿任务,我给你十秒钟完成,但不管发生什么事情我都会继续... ”