关闭范围和垃圾收集

时间:2010-10-14 05:20:42

标签: c# garbage-collection lambda closures

我刚刚编写了一些代码来执行超时操作,如果异步任务需要很长时间来处理,但我不清楚的是,是否以及何时将超时实例处理掉(我认为它将在异步任务及时完成的​​情况下,否则我不知道),或者如果我每次调用此代码时都要累积实例。

//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();
         }
    });

(如果有任何帮助,ProcessTimeout类使用System.Timers.Timer

1 个答案:

答案 0 :(得分:6)

目前尚不清楚timeout在这里是什么或DoAsyncTask是什么,但有几个一般要点:

  • 您的lambda表达式将捕获timeout 变量。它不会捕获变量的 ...因此,如果您稍后在同一方法中将其设置为null或其他值,则原始值将赢得' t在lambda表达式中保存。
  • lambda表达式 将阻止timeout引用的任何内容被垃圾回收,只要委托本身不符合垃圾回收的条件
  • 垃圾收集与处理不同。你谈到“什么时候超时实例将被处理掉” - 什么叫timeout?这不会受到垃圾收集器的影响,除非您依赖于为您调用Dispose的终结器。