-1

正確にはいつWaitHandle WaitOne(int timeout)戻ってきますか?タイムアウトが経過すると戻りますか? WaitOne()終了する前にいくつかのクリーンアップを行うロジックを実装するときにポーリングを提案するオンラインのコードをいくつか見ます。これは、タイムアウトが経過しても WaitOne() が戻らないことを意味します。代わりに、呼び出された直後に通知されたかどうかを返します。

public void SomeMethod()
{
  while (!yourEvent.WaitOne(POLLING_INTERVAL))
  {
    if (IsShutdownRequested())
    {
      // Add code to end gracefully here.
    }
  }
  // Your event was signaled so now we can proceed.
}

ここで達成しようとしているのは、呼び出し元のスレッドをブロックしてWaitHandleいる間に使用を通知する方法です。CancellationToken

4

1 に答える 1

1

「WaitHandle がタイムアウトする前、またはシグナルが送信される前であっても、待機中に呼び出しスレッドのブロックを基本的に停止したい」 - どのような状況でスレッドのブロックを解除しますか? 使用しているオブジェクトは既にありCancellationTokenますか?

もしそうなら、あなたは次のようなことをすることができます:

public void SomeMethod(CancellationToken token)
{
  int waitResult;

  while ((waitResult = WaitHandle.WaitAny(
      new [] { yourEvent, token.WaitHandle }, POLLING_INTERVAL)) == WaitHandle.WaitTimeout)
  {
    if (IsShutdownRequested())
    {
      // Add code to end gracefully here.
    }
  }
  if (waitResult == 0)
  {
      // Your event was signaled so now we can proceed.
  }
  else if (waitResult == 1)
  {
      // The wait was cancelled via the token
  }
}

WaitHandleの使用は必ずしも理想的ではないことに注意してください。WaitHandle.NET には、 (より大きなオーバーヘッドが発生するネイティブ OS オブジェクトに基づく)よりも効率的に動作する、最新のマネージド スレッド同期メカニズムがあります。しかし、最初から を使用する必要がある場合WaitHandleは、現在の実装を で動作するように拡張するには、おそらく上記の方法が適切な方法CancellationTokenです。

上記があなたの質問に対応していない場合は、シナリオを明確に示す適切で最小限完全なコード例を提供して、そのコード例が現在何をしているか、およびそれがあなたが望むものとどのように異なるかについての詳細な説明とともに、質問を改善してくださいする。

于 2015-10-06T07:07:06.120 に答える