c# - 关闭范围和垃圾收集

标签 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)

最佳答案

尚不清楚这里的 timeout 是什么或 DoAsyncTask 的作用是什么,但有一些一般性的要点:

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

关于c# - 关闭范围和垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3930292/

相关文章:

c# - asp.net 应用程序在本地主机上识别用户,但在没有硬编码用户名/密码的情况下无法在服务器上识别用户

ios - 使用 UITableView 的 native 代码中的 Monotouch 随机崩溃

java - 尝试使用将对象转换为字节数组时频繁GC

c# - 如何使用反射在运行时构建此 c# "Expression"?

python - 使用带有 `map` 的多个参数的函数

lambda - Kotlin 扩展 lambda 与常规 lambda

c# - 如果数据库中的列发生变化,有没有办法不破坏代码?

c# - 将一个字典转换为另一个具有不同键类型的字典

c# - 具有多个条件的 while 语句

c# - 数组中更改的项目是否进入垃圾收集?