2012-10-01 164 views
2

我有必須定期輪詢外部資源的代碼。簡化的,它看起來像:睡眠.NET任務,喚醒CancellationTokenSource.Cancel()

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秒延遲,這將被中斷,如果cancellationSource.Cancel()被調用?

回答

4

如何使用超時時間爲10秒的監視器。您可以喚醒沉睡緊扣與Monitor類

線程1的脈衝法:

Monitor.Wait(monitor, 10000); 

線程2:

Monitor.Pulse(monitor); 

或者你可以看看ManualResetEvent.WaitOne。用10秒超時阻塞線程。要取消阻止,請發送一個事件。

編輯:

的的CancellationToken有.WaitHandle屬性:

獲取令牌時被取消信號通知一個WaitHandle的。

你可以等待那個句柄被髮送信號,超時時間爲10秒?

+0

這可能會起作用,但它似乎......錯誤......需要第二個線程來脈衝第一個線程,以獲得可中斷的睡眠。 –

+0

但是,如果線程睡着了,我不會看到它是如何喚醒的,除非來自另一個線程。一個醜陋的方法是使其更加細化。循環做更小的睡眠,檢查取消布爾值。從CPU角度來看,Probs不理想。 –

+0

從概念上講,如果取消令牌被取消,線程調度程序可以中斷對任何延遲/等待的調用。不確定這是否可以實際完成。 –