我想触发一个计时器,以便在将来的某个时间点执行一次。我想使用 lambda 表达式来简化代码。所以我想做类似...
(new System.Threading.Timer(() => { DoSomething(); },
null, // no state required
TimeSpan.FromSeconds(x), // Do it in x seconds
TimeSpan.FromMilliseconds(-1)); // don't repeat
我认为它非常整洁。但在这种情况下,不会释放 Timer 对象。解决此问题的最佳方法是什么?或者,我应该在这里采用完全不同的方法吗?
最佳答案
这种方法是有缺陷的。
您正在内存中创建一个没有引用它的对象。这意味着计时器对象可用于垃圾回收。虽然此代码有时会起作用,但您无法预测垃圾收集何时开始并删除计时器。
例如,在下面的代码中,我强制执行垃圾回收,它导致计时器永远不会触发。
static void Main(string[] args)
{
DoThing();
GC.Collect();
Thread.Sleep(5000);
}
static void DoThing()
{
new System.Threading.Timer(x => { Console.WriteLine("Here"); },
null,
TimeSpan.FromSeconds(1),
TimeSpan.FromMilliseconds(-1));
}
关于c# - 将来某个时间调用单个操作的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1568789/