关闭范围和垃圾收集

Ben*_*jol 2 c# lambda closures garbage-collection

我刚刚编写了一些代码来执行超时操作,如果异步任务需要很长时间才能处理,但我不清楚的是,是否以及什么时候超时实例将被处理掉(我认为它会在异步任务及时完成,但我不知道,或者如果我每次调用此代码时都要累积实例.

//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();
         }
    });
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 6

目前还不清楚timeout这里有什么或者做什么DoAsyncTask,但有几点要点:

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