【问题标题】:Cancellation with WaitHandle使用 WaitHandle 取消
【发布时间】:2012-08-26 21:17:49
【问题描述】:

我阅读了很多关于 TPL 的内容,并找到了我们可以使用取消机制的方法。但我被 WaitHandle 卡住了。

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

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

编辑 MSDN 链接:http://msdn.microsoft.com/en-us/library/dd997364 .. 使用 WaitHandle 查看收听..

刚刚学习 TPL..

请帮忙..

【问题讨论】:

  • 您能否详细说明您的观点“何时使用 WaitHandle”。 “简单取消”是什么意思?

标签: c# task-parallel-library


【解决方案1】:

假设你有一个ManualResetEventSlim 类型的信号并且想要等待信号被设置、操作被取消或操作超时。然后你可以使用Wait method如下:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 2012-12-27
    相关资源
    最近更新 更多