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()被調用?
這可能會起作用,但它似乎......錯誤......需要第二個線程來脈衝第一個線程,以獲得可中斷的睡眠。 –
但是,如果線程睡着了,我不會看到它是如何喚醒的,除非來自另一個線程。一個醜陋的方法是使其更加細化。循環做更小的睡眠,檢查取消布爾值。從CPU角度來看,Probs不理想。 –
從概念上講,如果取消令牌被取消,線程調度程序可以中斷對任何延遲/等待的調用。不確定這是否可以實際完成。 –