在.Net中,我该如何使用Waithandles进行And和Or

时间:2013-02-26 10:29:15

标签: .net waithandle

我有一个数组WaitHandle[],对应于在线程可以继续之前都需要完成的任务。但我还有另一个WaitHandle,当用户请求中止时会发出信号。

那么让线程等到以下任何一种方式的最有效方法是什么:

  1. 发出数组WaitHandle []中的所有WaitHandle信号; OR

  2. 用户中止WaitHandle是否已发出信号?

2 个答案:

答案 0 :(得分:1)

这已经在.NET 4中提供了Task.WaitAll(Task [],CancellationToken)方法,因此请确保您没有尝试重新发明轮子。

如果由于某种原因无法迁移到.NET 4,或者过于致力于不使用Task类的现有代码,那么您可以实现类似于Task.WaitAll()的功能。基本方案是你只需按下WaitHandles列表并依次等待一个,使用WaitAny(),这样你也可以看到中止请求。像这样:

/// <summary>
/// Wait for all events with option to abort the wait
/// </summary>
/// <param name="waitHandles">Synchronization objects to wait for</param>
/// <param name="abortEvent">Event that signals an abort</param>
/// <returns>false if the wait was aborted</returns>
public static bool WaitAll(WaitHandle[] waitHandles, WaitHandle abortEvent) {
    WaitHandle[] pair = new WaitHandle[] { abortEvent, null };
    for (int ix = 0; ix < waitHandles.Length; ++ix) {
        pair[1] = waitHandles[ix];
        if (WaitHandle.WaitAny(pair) == 0) return false;
    }
    return true;
}

答案 1 :(得分:0)

您可以尝试WaitHandle.WaitAll()