我想在任务内部的间隔上运行一个函数。就像是,
Task t = Task.Factory.StartNew(() => {
while (notCanceled()) {
doSomething();
Thread.Sleep(interval);
}
});
在这里使用 Thread.Sleep() 是个坏主意吗?任务运行时间长,睡眠时间也可能很长(几分钟,甚至几小时)。
一种替代方法是使用 System.Timers.Timer 或 System.Threading.Timer。然而,这两者都会导致产生一个额外的线程(Elapsed 事件发生在一个新的线程池线程上)。因此,对于每个重复的任务,将有 2 个线程而不是 1 个。任务已经是异步的,所以我不希望以这种方式使事情复杂化。
另一种表现类似的方式是使用 ManualResetEvent,
ManualResetEvent m = new ManualResetEvent(false);
void sleep(int milliseconds)
{
m.WaitOne(milliseconds);
}
由于 m.Set() 永远不会被调用,这将始终等待正确的时间,并且也是单线程的。这与 Thread.Sleep() 相比有什么显着优势吗?
想知道这里的最佳做法是什么。
想法?