如何安全地处置System.Timers.Timer?

Ian*_*ose 9 .net multithreading dispose timer

当你处理一个"原始".net计时器时,你可以传入一个等待句柄,一旦Win32计时器被销毁就被调用,你可以假设你的回叫不会被调用.(并且计时器将被GC视为"死亡")

如何使用System.Timers.Timer执行此操作?

Chr*_*s S 0

由于 System.Timers.Timer 和 System.Windows.Forms.Timer 都使用 ThreadPool,因此它没有操作系统计时器的句柄,因此没有要处置的本机计时器资源 - 只是一个已完成的线程。我不确定您是否可以捕获线程池正在回收的线程,但我可能是错的。

您也许可以自己推出(我还没有测试过这一点,并且在 Dispose 中使用 ManualResetEvent 可能更有用):

void Run()
{
    ManualResetEvent resetEvent = new ManualResetEvent(false);

    System.Threading.Timer timer = new System.Threading.Timer(delegate { Console.WriteLine("Tick"); });
    timer.Dispose(resetEvent);

    MyTimer t = new MyTimer();
    t.Interval = 1000;
    t.Elapsed += delegate { t.Dispose(resetEvent); };

    resetEvent.WaitOne();
}


public class MyTimer : System.Timers.Timer
{
    protected override void Dispose(bool disposing)
    {
        base.Dispose(disposing);
    }

    public virtual void Dispose(WaitHandle handle)
    {
        handle.SafeWaitHandle.Close();
        Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)