我想在任务内部的时间间隔上运行函数。类似的,单线程计时器和/或任务内的时间间隔<T>
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()有什么明显的优势吗?
想知道最好的做法是在这里。
想法?
你对Timer有错误的想法。它使用*一个* tp线程,一个短跑。你不再使用现在使用的昂贵的长时间运行的。 –