如果没有对它的引用,任务是否会被垃圾收集中断?

时间:2018-05-16 17:53:34

标签: c# .net async-await task

在这里进行理智检查。假设我启动一个任务,但我没有等待它,我也没有存储对它的引用。换句话说,我只是运行:

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

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

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

1 个答案:

答案 0 :(得分:3)

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