我有一个数组WaitHandle[]
,对应于在线程可以继续之前所有需要完成的任务。但是我还有另一个 WaitHandle 会在用户请求中止时发出信号。
那么让线程等待的最有效方法是什么:
数组 WaitHandle[] 中的所有 WaitHandles 都发出信号;或者
用户中止 WaitHandle 是否发出信号?
我有一个数组WaitHandle[]
,对应于在线程可以继续之前所有需要完成的任务。但是我还有另一个 WaitHandle 会在用户请求中止时发出信号。
那么让线程等待的最有效方法是什么:
数组 WaitHandle[] 中的所有 WaitHandles 都发出信号;或者
用户中止 WaitHandle 是否发出信号?
这已经在 .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;
}
你可以试试WaitHandle.WaitAll()