我遇到了一些行爲,讓我對使用垃圾收集器異步等待模式的行爲感到困惑。這裏是生產代碼的解釋。對象引用在多層異步等待操作中丟失
public async Task CreateProduct(int id)
{
Product result = factory.Create(id);
await AssignPrices(result);
GC.KeepAlive(result);
Assert.That(result.Prices.Count == 1); //this is true
}
public async Task AssignPrices(Product value)
{
foreach (var engine in pricingEngines)
{
await engine.AddPrice(value);
}
}
public class DefaultPricingEngine
{
public async Task AddPrice(Product value)
{
var price = await _externalApi.GetPrice();
value.Prices.Add(price);
}
}
class Product
{
public int Id{get;set;}
public string Name {get;set;}
public List<decimal> Prices {get;set;}
}
如果我省略GC.KeepAlive
它似乎恢復到最初創建的產品。如果我保留它,價格會按預期添加。
究竟是什麼在這裏發生,導致清理..是GC.KeepAlive
這是一個虛假的肯定是真的在繼續。
這非常需要一個MVCE。封裝在一個小的控制檯或WinForms應用程序。原因很可能在周圍的項目中。 –