我正在阅读很多关于TPL的内容,并找出了我们使用取消机制的方法。但是我被WaitHandle困住了。
如果我想取消任务,我可以定义CancellationTokenSource并将其与任务一起传递,我可以使用ThrowIfCancellationRequested方法取消任务。
我的问题是,当我需要使用WaitHandle进行取消时,以及为什么在这种情况下简单取消不起作用?
编辑 MSDN链接:http://msdn.microsoft.com/en-us/library/dd997364 ..请参阅使用WaitHandle进行收听..
刚刚学习TPL ..
请帮助..
答案 0 :(得分:17)
假设您有ManualResetEventSlim类型的信号,并希望等待设置信号,取消操作或超时操作。然后您可以使用Wait method,如下所示:
if (signal.Wait(TimeSpan.FromSeconds(10), cancellationToken))
{
// signal set
}
else
{
// cancelled or timeout
}
但是如果你有ManualResetEvent类型的信号,就没有这样的等待方法。在这种情况下,您可以使用CancellationToken的WaitHandle和WaitHandle.WaitAny method来达到同样的效果:
if (WaitHandle.WaitAny(new WaitHandle[] { signal, cancellationToken.WaitHandle },
TimeSpan.FromSeconds(10)) == 0)
{
// signal set
}
else
{
// cancelled or timeout
}