如果没有对任务的引用,垃圾收集会中断任务吗?

Bri*_*Rak 5 .net c# task async-await

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

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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

Ser*_*rvy 6

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