Tuesday, July 21, 2020

Dispose 计时器 System.Threading.Timer 问题

1. 在彻底销毁前等待排队中的和进行中的回调完成
using (ManualResetEvent waitHandle = new ManualResetEvent(false))
{
    //若_timer.Dispose(waitHandle)已被调用过,则会返回false,可以防止重复调用
    if (_timer.Dispose(waitHandle))
     {
         //等待排队中的和正在执行的回调完成,并设置超时
         //回调结束时会自动调用waitHandle.Set()来解除阻塞
         waitHandle.WaitOne(milliseconds);

     }
}

2.  在Dispose后,回调中的ObjectDisposedException异常
try
{
    _timer.Change(dueTime, period);
}
catch(ObjectDisposedException)
{

}


参考:
注意Dispose(WaitHandle) 方法的备注Remarks部分


No comments:

Post a Comment

ACL的permit和deny两种含义

 permit 允许    deny 拒绝  permit 匹配    deny 不匹配