【问题标题】:Lifetime of the async delegate invocation异步委托调用的生命周期
【发布时间】:2012-06-28 22:14:54
【问题描述】:

我的服务中有以下代码:

protected override void OnStart(string[] args)
{
    var cleaner = new Cleaner();
    Action action = cleaner.Run;
    action.BeginInvoke(null, null);
}

我担心是否应该将委托移动到实例变量,因为它使用的对象可能会被 GC 收集,因为它们只是在本地创建的。

【问题讨论】:

  • 您是否尝试致电GC.Collect() 看看会发生什么?

标签: c# asynchronous delegates windows-services


【解决方案1】:

如果收集了仍在“使用”的对象会怎样?这个问题没有理智的答案。出于这个原因,CLR 保证不会对仍被引用的对象进行垃圾回收。无论您如何编写代码,您都是安全的。

如果对象仍被引用,您甚至无法收集这些对象。即使你想。

【讨论】:

  • action本身不能收集吗?
  • 它可以,如果没有人使用它(例如在调用 BeginInvoke 之后,甚至可能在期间)。您是否怀疑这会导致问题?它不能/不应该。
  • 所以action 被收集,然后cleaner 被收集。所以仍在运行cleaner.Run函数的线程将留下无效数据。
  • “无效”是什么意思?看我的回答。这样的事情是不存在的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多