简单的例子:
public abstract class Example {
protected abstract Task<ReallyLargeItem> GetItem();
public async IAsyncEnumerable<ReallyLargeItem> Producer() {
while(true) {
yield return await GetItem();
}
}
public async Task Consumer()
{
await foreach(var item in Producer())
Console.WriteLine(item == null ? "hello" : "world); // Just print something silly to signify the JIT cannot optimise this away here
}
}
我们来说吧
一旦 Consumer 打印了其第一行并命中循环的第二个可等待迭代,该项目是否会立即变得可释放(通过 GC)?
或者它生成的枚举器是否会保留生成的第一个项目的引用,直到生产者实际生成第二个项目 - 也就是说,至少一个小时?
我知道 SharpLab 理论上有答案,但看看生成的状态机,不幸的是我不太希望我能破译它..
我认为您可以通过使用
WeakReference
找到最简单的方法
WeakReference weakRef = new WeakReference(myObject);
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
if (weakRef.IsAlive) {
Console.WriteLine("The object is still alive.");
} else {
Console.WriteLine("The object has been garbage collected.");
}