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

时间:2015-11-04 11:02:09

标签: c# multithreading

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有什么关系呢?

3 个答案:

答案 0 :(得分:3)

如果(a)任何包装完成的任务或(b)超时超时,

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 ;.

Embrace async/await获胜。

答案 1 :(得分:0)

如果你看这里:https://msdn.microsoft.com/en-us/library/dd235650(v=vs.110).aspx IT表示如果发生超时,waitAny将返回-1。这是你首先得到的结果。不是你的期望吗?

这意味着代码继续通过WaitAny,但并不意味着它正在等待的任务已被取消。

答案 2 :(得分:0)

  

那么那个超时与Task和WaitAny有关吗?

它什么都不做。当你设置10000的超时时,就像你说:

嘿任务,我给你十秒钟完成,但不管发生什么事情我都会继续...