自动处理Threading.Timer

Sin*_*atr 6 c# lambda dispose timer

我想要一些非常简单的东西

// increment counter
Interlocked.Increment(ref _counter);

// automatically decrement counter after 1 sec
Timer timer = new Timer((o) => {
    Interlocked.Decrement(ref _counter);
    (o as Timer).Dispose();
}, timer, 1000, Timeout.Infinite);
Run Code Online (Sandbox Code Playgroud)

但是,此代码不可编译

使用未分配的局部变量'timer'

有什么简单的方法来修复它吗?一定是Threading.Timer.

PS:我不确定我是否必须打电话Dispose,这显然是未经管理的资源而且IDisposable仍然在msdn上他们警告

只要您使用Timer,就必须保留对它的引用.与任何托管对象一样,当没有对它的引用时,Timer会进行垃圾回收.Timer仍处于活动状态这一事实并不能阻止它被收集.

我实际上希望它被收集(自动处理?).那么,处置还是不处置?

usr*_*usr 6

有一个模式:

Timer timer = null;
timer = new Timer...
Run Code Online (Sandbox Code Playgroud)

现在你可以timer在lambda体中使用了.这基本上是一种让编译器在执行相同操作时快乐的方法.

务必处理该计时器.定时器可能由操作系统句柄资源备份(我认为CLR实现改变了几次).我相信计时器还包含GC手柄.没有处理大部分时间都是无害.但是谁知道你可以用大量不受干扰的计时器引发的稀有资源枯竭.

进行一些代码审查:如果您希望演员表始终有效,请不要使用as因为as文档失败是预期的情况.不是:(o as Timer).相反:((Timer)o).

  • @MarcelN.没人想要这样. (2认同)