【问题标题】:Will a task ever be interrupted by garbage collection if there are no references to it?如果没有对它的引用,任务是否会被垃圾收集中断?
【发布时间】:2018-05-17 02:03:49
【问题描述】:

在这里进行完整性检查。假设我开始了一项任务,但我没有等待它,也没有存储对它的引用。换句话说,我只是运行:

async Task PerformLongOperation() {
    await Task.Delay(10 * 1000);
    Debug.WriteLine("All done!");
}

void DoSomething() {
    // Kick off the operation and allow it to complete when it does.
    PerformLongOperation();
}

显然,如果不保留对 PerformLongOperation() 返回的 Task 的引用,我无法知道它是否以及何时完成。但是假设在某些情况下这不是必需的。

垃圾收集是否会注意到任务在没有引用的情况下运行,然后取消并清理它?

【问题讨论】:

  • Task 类没有这样的错误。您不能假设它总是完成,因为您无法确保它不会因未处理的异常而死。或者您让程序运行足够长的时间以使其完成。

标签: c# .net async-await task


【解决方案1】:

没有。 Task 类保留一个私有静态集合,其中包含对所有当前正在运行的任务的引用,因此即使您的代码都没有对它的引用,那也将是。此外,任务都持有代表其延续的任务的引用,因此也无法从正在运行的任务中收集任何代表延续(通过任意数量的间接层)的任务。

【讨论】:

  • 子任务(附加而不附加到父任务)呢?
  • @JohnyL 这是我在回答中提到的延续。一个任务需要引用它的所有延续,以便它可以告诉它们在完成时运行。
  • 对不起,继续任务和子任务是一回事吗?
  • @JohnyL 如果您不是指延续,那么您将需要更具体地说明您所指的内容。
猜你喜欢
  • 2013-10-18
  • 2020-02-11
  • 1970-01-01
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多