在这里进行理智检查。假设我启动一个任务,但我没有等待它,我也没有存储对它的引用。换句话说,我只是运行:
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()
的引用,我无法知道它是否以及何时完成。但是假设在某些情况下这不是必需的。
垃圾收集是否有任何危险,注意到任务在没有引用的情况下运行,取消并清理它?
答案 0 :(得分:3)
没有。 Task
类保留一个私有静态集合,其中包含对所有当前正在运行的任务的引用,因此即使您的代码中没有任何代码持有对它的引用,也就是这样。此外,任务都保留在表示其延续的任务的引用上,因此任何表示来自正在运行的任务的延续(通过任意数量的间接层)的任务也都无法收集。