gpt4 book ai didi

.net - 如何安全地处理 System.Timers.Timer?

转载 作者:行者123 更新时间:2023-12-04 04:32:20 30 4
gpt4 key购买 nike

当您处理“原始”.net 计时器时,您可以传入等待句柄以在 Win32 计时器被销毁后调用,并且您可以假设您的回调不会被调用。 (并且计时器将被 GC 视为“死”)

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

最佳答案

由于 System.Timers.Timer 和 System.Windows.Forms.Timer 都使用 ThreadPool,它没有操作系统计时器的句柄,因此没有处理的 native 计时器资源 - 只是一个已完成的线程。我不确定您是否可以捕获被 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();
}
}

关于.net - 如何安全地处理 System.Timers.Timer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4277044/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com