WaitHandle[]
スレッドが続行する前にすべて完了する必要があるタスクに対応する配列があります。しかし、ユーザーが中止を要求したときに通知される別の WaitHandle もあります。
したがって、次のいずれかになるまでスレッドを待機させる最も効率的な方法は何ですか。
配列 WaitHandle[] 内のすべての WaitHandles が通知されます。また
ユーザー アボート WaitHandle が通知されますか?
WaitHandle[]
スレッドが続行する前にすべて完了する必要があるタスクに対応する配列があります。しかし、ユーザーが中止を要求したときに通知される別の WaitHandle もあります。
したがって、次のいずれかになるまでスレッドを待機させる最も効率的な方法は何ですか。
配列 WaitHandle[] 内のすべての WaitHandles が通知されます。また
ユーザー アボート WaitHandle が通知されますか?
これは、Task.WaitAll(Task[], CancellationToken) メソッドを使用して .NET 4 で既に提供されているため、車輪の再発明を試みていないことを確認してください。
何らかの理由で .NET 4 に移行できない場合、または Task クラスを使用しない既存のコードにこだわりすぎている場合は、Task.WaitAll() と同様のものを実装できます。基本的なスキームは、WaitHandles のリストをたどり、WaitAny() を使用して順番に 1 つずつ待機するだけなので、中止要求も確認できます。このような:
/// <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()