scheduledExecutorService
,它将在计划的时间间隔内运行这些任务。do { DoWork(); }while(!stopRequested)
现在我们想要在工作周期之间暂停。大家似乎都认为Thread.Sleep()是魔鬼。我看到有人提到使用Monitor/Event的东西,但我们没有别人告诉我们要做什么工作。我们只想每N分钟做一些事情,如钟表般准时。
所以是否有替代方案或者我已经找到了Thread.Sleep的有效用法?
另外一个帖子中的某人提到了WaitHandle.WaitOne()作为替代方案,但显然无法从非静态方法中调用它?或者至少我不能,因为我得到了编译时错误..
需要对象引用 ‘System.Threading.WaitHandle.WaitOne(System.TimeSpan)’的非静态字段、方法或属性
ManualResetEvent
是IDisposable
的,但是你的代码让匿名实例被垃圾回收了。在这种情况下不显式调用Dispose
是否存在任何风险? - DaiManualResetEvent
使用了基本的WaitHandle
功能,其Dispose方法只是处理其内部的SafeWaitHandle
实例。SafeWaitHandle
的基类SafeHandle
在其析构函数中显式调用了自己的Dispose方法,因此我认为当对象被GC时,任何未管理的OS句柄都会在那个时候被清理掉。但是,在2016年最好的选择是使用Task.Delay
并避免整个问题。 :) - Calvin Fisherawait Task.Delay(2000)
会在高负载情况下准确地在2秒后执行吗?还是这取决于线程池中下一个线程的可用性?(该问题更偏向于ASP.NET,我不确定Task
是否依赖于线程池。如果问题表述不清,请见谅。) - Krishnan