睡眠.NET任务,在CancellationTokenSource.Cancel()上唤醒

时间:2012-10-01 21:29:08

标签: .net multithreading

我的代码必须定期轮询外部资源。简化,看起来像:

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

如果调用了cancellationSource.Cancel(),我怎么能以这样的方式编码10秒延迟呢?

1 个答案:

答案 0 :(得分:4)

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

主题1:

Monitor.Wait(monitor, 10000);

主题2:

Monitor.Pulse(monitor);

或者您可以查看ManualResetEvent.WaitOne。以10秒超时阻止线程。要取消阻止,请发出事件信号。

编辑:

CancellationToken具有.WaitHandle属性:

  

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

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