Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重载版本的Task.WaitAny是否取消任务?_C#_Multithreading - Fatal编程技术网

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

C# 重载版本的Task.WaitAny是否取消任务?,c#,multithreading,C#,Multithreading,上述方法是否在超时后取消任务?看起来没有,但是C#70-483考试参考书说这个超载的版本取消了任务。下面是一些测试代码 int WaitAny(Task[] tasks, int millisecondsTimeout); Task longlunning=Task.Run(()=> { 睡眠(10000); }); int index=Task.WaitAny(新任务[]{longRunning},1000);//返回-1 索引=0;//将其重置为在循环中重用 而(指数

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

int WaitAny(Task[] tasks, int millisecondsTimeout); 
Task longlunning=Task.Run(()=>
{
睡眠(10000);
});
int index=Task.WaitAny(新任务[]{longRunning},1000);//返回-1
索引=0;//将其重置为在循环中重用
而(指数<12)
{
睡眠(1000);
索引++;
WriteLine(“长时间运行的任务状态{0}”,longRunning.status);
}

前几次,状态为正在运行,之后状态更改为RanToCompletion。那个么,超时和任务和等待有什么关系呢

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

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

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);
}
当然,非常不鼓励使用阻塞方法等待任务完成,在
任务中包装同步阻塞代码也是如此。运行
并期望一切正常且“异步”运行

为了胜利。

如果你看这里: 如果超时发生,waitAny返回-1。这是你首先得到的结果。这不是你的期望吗

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

那个么,超时和任务和等待有什么关系呢

它什么也不做。当您将超时设置为10000时,就像您说:


“嘿,任务,我给你十秒钟的时间来完成,但不管发生什么事,我都会继续……”

你说的“前几次”到底是什么意思?10秒后,长时间运行的任务将运行到完成。。。你能引用考试参考书中的确切陈述吗?1000毫秒后,它将停止等待。这是等待的时间。就像其他等待方法一样。@JonSkeet我说的是while循环运行时的任务状态。因为当前线程正在阻塞,同时长时间运行的任务也在执行其任务。在循环中,前8次(几次)将状态打印为正在运行,然后在循环中打印状态为RanToCompletion。对,这为什么令人惊讶?任务未取消。。。它运行到完成。这就是为什么我要求你引用声称WaitAny取消了任务的确切声明。这让我感到惊讶,因为第39页的《考试参考文献70-483》一书中说“如果你想在一定时间后取消任务,你可以使用Task.WaitAny的重载,这需要一个超时”。我向各位专家核实这一说法。看来这本书误导了我们。无论如何,谢谢。
 using(CancellationTokenSource cts=new CancellationTokenSource(TimeSpan.FromSeconds(5)))
{
    var task = Task.Delay(TimeSpan.FromSeconds(10), cts.Token);
    task.Wait();
}