代码之家  ›  专栏  ›  技术社区  ›  Benjol

关闭范围和垃圾收集

  •  2
  • Benjol  · 技术社区  · 14 年前

    认为 如果异步任务及时完成,或者每次调用此代码时都会累积实例,则会发生这种情况。

    //StartNew creates a new instance of System.Timers.Timer, and 
    //  invokes the ActionOnTimeout after 2000ms, unless calling code
    //  calls "Stop" first
    var timeout = ProcessTimeout.StartNew(() => ActionOnTimeout(), 2000);
    
    //DoAsyncTask creates a new thread, does potentially slow stuff, 
    ///   then invokes this callback
    DoAsyncTask(() => 
        {
             if(timeout.Running)
             {
                 timeout.Stop();
                 DoCallbackStuff();
             }
        });
    

    System.Timers.Timer )

    1 回复  |  直到 14 年前
        1
  •  6
  •   Jon Skeet    14 年前

    不清楚是什么 timeout DoAsyncTask 是的,但有几个要点:

    • 你的lambda表达式将捕获 变量 . 它不会抓住 超时 如果为null或其他值,则lambda表达式中不会保留原始值。
    • 防止一切 超时
    • 垃圾收集和处理是不一样的。你说的是“当超时实例将被处理”是什么意思 Dispose ? 这不会受到垃圾回收器的影响,除非您依赖于终结器调用 处置 为你。