Ian*_*ose 9 .net multithreading dispose timer
当你处理一个"原始".net计时器时,你可以传入一个等待句柄,一旦Win32计时器被销毁就被调用,你可以假设你的回叫不会被调用.(并且计时器将被GC视为"死亡")
如何使用System.Timers.Timer执行此操作?
由于 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)
| 归档时间: |
|
| 查看次数: |
6230 次 |
| 最近记录: |