如果在没有完成任务的情况下超时,Task.Wait(int)是否会停止任务?

我有一个任务,我希望它可以在一秒钟内运行,但如果需要的时间超过几秒钟,我想取消任务。

例如:

Task t = new Task(() => { while (true) { Thread.Sleep(500); } }); t.Start(); t.Wait(3000); 

请注意,等待3000毫秒后,等待到期。 超时到期或任务是否仍在运行时,任务是否被取消?

如果要取消Task ,则应在创建任务时传入CancellationToken 。 这将允许您从外部取消Task 。 如果需要,您可以将取消绑定到计时器。

要使用Cancellation标记创建任务,请参阅以下示例:

 var tokenSource = new CancellationTokenSource(); var token = tokenSource.Token; var t = Task.Factory.StartNew(() => { // do some work if (token.IsCancellationRequested) { // Clean up as needed here .... } token.ThrowIfCancellationRequested(); }, token); 

要取消Task请在tokenSource上调用Cancel()

Task.Wait()等待任务完成的指定时间段,并返回任务是否在指定的时间(或更早)完成。 任务本身不会被修改,也不依赖于等待。

阅读精彩系列: .NET中的并行性,.NET中的并行性 – 第10部分,PLINQ中的取消和 Reed Copsey 的Parallel类

并且: .NET 4取消框架 / 并行编程:任务取消

检查以下代码:

 var cts = new CancellationTokenSource(); var newTask = Task.Factory.StartNew(state => { var token = (CancellationToken)state; while (!token.IsCancellationRequested) { } token.ThrowIfCancellationRequested(); }, cts.Token, cts.Token); if (!newTask.Wait(3000, cts.Token)) cts.Cancel(); 

任务仍在运行,直到您明确告诉它停止或循环结束(这将永远不会发生)。

您可以检查等待的返回值以查看:

(来自http://msdn.microsoft.com/en-us/library/dd235606.aspx )返回值

类型:System.Boolean如果任务在指定的时间内完成执行,则为true;否则为false。 否则,是的。

超时到期或任务是否仍在运行时,任务是否被取消?

不,是的。

传递给Task.Wait的超时是针对Wait而不是任务。