使用WaitHandle取消

时间:2012-08-26 11:30:59

标签: c# task-parallel-library

我正在阅读很多关于TPL的内容,并找出了我们使用取消机制的方法。但是我被WaitHandle困住了。

如果我想取消任务,我可以定义CancellationTokenSource并将其与任务一起传递,我可以使用ThrowIfCancellationRequested方法取消任务。

我的问题是,当我需要使用WaitHandle进行取消时,以及为什么在这种情况下简单取消不起作用?

编辑 MSDN链接:http://msdn.microsoft.com/en-us/library/dd997364 ..请参阅使用WaitHandle进行收听..

刚刚学习TPL ..

请帮助..

1 个答案:

答案 0 :(得分:17)

假设您有ManualResetEventSlim类型的信号,并希望等待设置信号,取消操作或超时操作。然后您可以使用Wait method,如下所示:

if (signal.Wait(TimeSpan.FromSeconds(10), cancellationToken))
{
    // signal set
}
else
{
    // cancelled or timeout
}

但是如果你有ManualResetEvent类型的信号,就没有这样的等待方法。在这种情况下,您可以使用CancellationTokenWaitHandleWaitHandle.WaitAny method来达到同样的效果:

if (WaitHandle.WaitAny(new WaitHandle[] { signal, cancellationToken.WaitHandle },
                       TimeSpan.FromSeconds(10)) == 0)
{
    // signal set
}
else
{
    // cancelled or timeout
}