2

外部リソースを定期的にポーリングする必要があるコードがあります。単純化すると、次のようになります。

CancellationTokenSource cancellationSource = new CancellationTokenSource();

Task t = Task.Factory.StartNew(() =>
    {
        while (!cancellationSource.IsCancellationRequested)
        {
            Console.WriteLine("Fairly complex polling logic here.");

            // Finishes sleeping before checking for cancellation request
            Thread.Sleep(10000); 
        }
    },
    cancellationSource.Token);

cancelSource.Cancel() が呼び出された場合に中断されるように、10 秒の遅延をコーディングするにはどうすればよいですか?

4

1 に答える 1

4

タイムアウトが 10 秒の Monitor を使用するのはどうですか。Monitor クラスの Pulse メソッドを使用して、スリープ状態のスレッドを起こすことができます。

スレッド 1:

Monitor.Wait(monitor, 10000);

スレッド 2:

Monitor.Pulse(monitor);

または、 ManualResetEvent.WaitOneを見ることができます。10 秒のタイムアウトでスレッドをブロックします。ブロックを解除するには、イベントを通知します。

編集:

CancellationToken には .WaitHandle プロパティがあります。

トークンがキャンセルされたときに通知される WaitHandle を取得します。

10 秒のタイムアウトで、そのハンドルが通知されるのを待つことができますか?

于 2012-10-01T21:34:40.363 に答える