1

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

那么让线程等待的最有效方法是什么:

  1. 数组 WaitHandle[] 中的所有 WaitHandles 都发出信号;或者

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

4

2 回答 2

1

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

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

/// <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;
}
于 2013-02-26T17:26:45.850 回答
0

你可以试试WaitHandle.WaitAll()

于 2013-02-26T10:49:23.497 回答