c# - 将来某个时间调用单个操作的最佳方式?

标签 c# .net lambda

我想触发一个计时器,以便在将来的某个时间点执行一次。我想使用 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/

相关文章:

c# - 为什么我的C#gzip生成的文件比Fiddler或PHP大?

c# - 如果使用继承,如何检查列表的类型

.net - WCF UriTemplate 不会匹配带有斜杠(/)的单个字符串参数

c++ - 如何明确说明 lambda 中捕获变量的类型?

c# - 使用电子邮件地址的 Asp.Net 身份验证

c# - 跟踪最近崩溃的应用程序

.net - .NET 中的 ListView.ItemCheck 与 ListView.ItemChecked

c# - WCF 中的 WCF 服务引用未正确获取方法类型

java - setter 的 Lambda 表达式

c++ - 使用 tie 从元组中分配 2 个 lambda