【问题标题】:C# Delay operation without memory leaking没有内存泄漏的C#延迟操作
【发布时间】:2013-09-20 12:13:05
【问题描述】:

将操作延迟几秒钟的最佳方法是什么? 我在stackoverflow上找到了以下代码:

var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(5) };
timer.Start();
timer.Tick += (_sender, _args) =>
{
     timer.Stop();
     operation();
};

但我认为垃圾收集器不够聪明,无法从内存中删除此计时器,因为它不知道 Tick 依赖于 Start / Stop 操作,并且该计时器将不再打开.

我想我需要先删除一个事件,但要做到这一点,我必须将 lambda 提取到 一个单独的方法。有没有更好的方法来简单地延迟操作?

【问题讨论】:

  • 看看System.Threading.SpinWait

标签: c# memory-leaks timer garbage-collection delay


【解决方案1】:

问题是您试图延迟什么“操作”。如果它是当前线程,那么 Soner Gönül 的解决方案就是要走的路。它还向应用程序发出信号以重新调度到另一个线程。

【讨论】:

    【解决方案2】:

    为什么不处理掉计时器,然后设置为空?

    var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(5) };
    timer.Start();
    timer.Tick += (_sender, _args) =>
    {
         timer.Stop();
         //timer.Dispose(); <-- Not available on a dispatch timer
         timer = null;
         operation();
    };
    

    【讨论】:

    • 因为定时器没有任何Dispose方法
    • 是的,对不起,我以为是普通的计时器。不过,设置为 null 应该可以解决问题,不是吗?
    • 我不这么认为,因为当函数结束时,对这个计时器的引用已经消失了
    • 在这种情况下,您关于原始代码会泄漏内存的断言也是错误的。至少将其设置为 null,这意味着如果在 operation() 期间有 GC,则计时器将准备好释放。
    • 但是如果你不停止 Tick 函数中的计时器,计时器将保持计时 - 这意味着它仍在内存中,调用 Stop 只是暂停它
    猜你喜欢
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 2022-06-16
    相关资源
    最近更新 更多