如果在没有完成任务的情况下超时,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
而不是任务。