[トピック内 5 記事 (1 - 5 表示)] << 0 >>
ManualResetEventとCancellationTokenを使って 処理の中断と再開を実装しています。 処理途中でスリープするのですがManualResetEvent.Reset();が発行された場合に 即座にスリープを抜けたいのですがどのような方法があるでしょうか。 while (!処理して正常終了フラグを返す) { // 30秒スリープ、スリープ途中でキャンセルされた場合は例外発行 if (CancellationToken.WaitHandle.WaitOne(30 * 1000)) {throw new OperationCanceledException();} // ManualResetEvent.Reset();が発行された場合にスリープを即座に抜けて停止したい // ManualResetEvent.Reset();、ManualResetEvent.Set();が発行されれば即座に次処理を行いたい }
ご回答ありがとうございます。 以下のコードを記述してみたのですが、EventWaitHandle.WaitAnyの戻り値に WaitHandle.WaitTimeoutが戻ってこず困っています。 ループ中にManualResetEvent.Reset();ManualResetEvent.Start(); (中断・再開すると)するとタイムアウトが発生するのですが・・・ EventWaitHandle.WaitAnyはWaitHandleに何らかのイベントが発生しないと タイムアウトとすることができないのでしょうか。 私のEventWaitHandle.WaitAnyの使い方がそもそも間違っているような気もします。。。 よろしくお願いいたします。 if (!MainProcess()) // メインプロセスでエラーが発生した場合は30秒待ってから再度メインプロセスを実行 while (true) { int eventThatSignaledIndex = EventWaitHandle.WaitAny(new WaitHandle[] { ManualResetEvent, CancellationToken.WaitHandle }, 30 * 1000); // 一時停止の場合は無限に待つ ManualResetEvent.WaitOne(-1); // タスクがキャンセルされている場合は例外発行 CancellationToken.ThrowIfCancellationRequested(); if (eventThatSignaledIndex == WaitHandle.WaitTimeout) { // 30秒経過した場合はメインプロセス実行 if (MainProcess()) { break; // 正常終了の場合は終了 } } } }
■No93443 (tama さん) に返信 EventWaitHandle.WaitAny の戻り値を確認してから次の動作を行ってください。 int eventThatSignaledIndex = EventWaitHandle.WaitAny(new WaitHandle[] { ManualResetEvent, CancellationToken.WaitHandle }, 30 * 1000); switch (eventThatSignaledIndex) { case 0: ManualResetEvent.Reset(); // AutoResetEvent ならリセットの必要なし // ManualResetEvent がセットされたときの処理 break; case 1: // タスクがキャンセルされたときの処理 break; default: // タイムアウトの処理 break; }
管理者用
- Child Tree -