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);

如何以这样的方式对 10 秒延迟进行编码,以便在调用 cancelSource.Cancel() 时将其中断?

4

1 回答 1

4

如何使用超时为 10 秒的监视器。您可以使用 Monitor 类的 Pulse 方法唤醒睡眠线程

线程 1:

Monitor.Wait(monitor, 10000);

线程 2:

Monitor.Pulse(monitor);

或者您可以查看ManualResetEvent.WaitOne。用 10 秒超时阻塞线程。要解除阻塞,请发出事件信号。

编辑:

CancellationToken 有一个 .WaitHandle 属性:

获取在取消令牌时发出信号的 WaitHandle。

您可以等待该句柄发出信号,超时 10 秒?

于 2012-10-01T21:34:40.363 回答