如果超时后任务仍未完成,Task.Wait(int) 是否会停止任务?
我有一个任务,我预计它需要不到一秒钟的时间才能运行,但如果它需要的时间超过几秒钟,我想取消该任务。
例如:
Task t = new Task(() =>
{
while (true)
{
Thread.Sleep(500);
}
});
t.Start();
t.Wait(3000);
请注意,3000 毫秒后等待到期。超时后任务是被取消还是任务仍在运行?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
Task.Wait()
等待指定时间段内的任务完成,并返回任务是否在指定时间(或更早)内完成。任务本身不会被修改,也不依赖于等待。阅读精彩系列: . NET,.NET 中的并行性 – 第 10 部分,PLINQ 中的取消和 Parallel 类 作者:Reed Copsey
以及: 并行编程:任务取消
检查以下代码:
Task.Wait()
waits up to specified period for task completion and returns whether the task completed in the specified amount of time (or earlier) or not. The task itself is not modified and does not rely on waiting.Read nice series: Parallelism in .NET, Parallelism in .NET – Part 10, Cancellation in PLINQ and the Parallel class by Reed Copsey
And: .NET 4 Cancellation Framework / Parallel Programming: Task Cancellation
Check following code:
如果您想取消
Task
,则应在创建任务时传入CancellationToken
。这将允许您从外部取消Task
。如果需要,您可以将取消与计时器联系起来。要使用取消令牌创建任务,请参阅以下示例:
要取消
Task
,请在tokenSource
上调用Cancel()
。If you want to cancel a
Task
, you should pass in aCancellationToken
when you create the task. That will allow you to cancel theTask
from the outside. You could tie cancellation to a timer if you want.To create a Task with a Cancellation token see this example:
To cancel the
Task
callCancel()
on thetokenSource
.该任务仍在运行,直到您明确告诉它停止或循环完成(这永远不会发生)。
您可以检查 Wait 的返回值来查看此内容:(
来自 http://msdn .microsoft.com/en-us/library/dd235606.aspx)
返回值
类型:System.Boolean
如果任务在指定时间内完成执行,则为 true;否则为假。
The task is still running until you explicitly tell it to stop or your loop finishes (which will never happen).
You can check the return value of Wait to see this:
(from http://msdn.microsoft.com/en-us/library/dd235606.aspx)
Return Value
Type: System.Boolean
true if the Task completed execution within the allotted time; otherwise, false.
否和是。
传递给
Task.Wait
的超时是针对Wait
的,而不是针对任务的。No and Yes.
The timeout passed to
Task.Wait
is for theWait
, not the task.如果您的任务调用任何同步方法来执行任何类型的 I/O 或其他需要时间的未指定操作,则没有通用方法可以“取消”它。
根据您尝试“取消”它的方式,可能会发生以下情况之一:
在有效的场景中,您可以并且可能应该使用其他答案中描述的通用方法之一取消任务。但是,如果您在这里是因为想要中断特定的同步方法,最好查看该方法的文档,以了解是否有办法中断它,它是否有“超时”参数,或者是否存在可中断的变化它的。
If your task calls any synchronous method that does any kind of I/O or other unspecified action that takes time, then there is no general way to "cancel" it.
Depending on how you try to "cancel" it, one of the following may happen:
There are valid scenarios where you can and probably should cancel a task using one of the generic methods described in the other answers. But if you are here because you want to interrupt a specific synchronous method, better see the documentation of that method to find out if there is a way to interrupt it, if it has a "timeout" parameter, or if there is an interruptible variation of it.