如何使用async-await延迟加载集合?

时间:2019-04-16 12:45:55

标签: c# async-await lazy-loading

如何使用Lazy async-await加载Bars集合?必须从MyClass实例中获取一个ID才能取回特定集合。

  public class MyClass {
    public int Id { get; set; }
    public Lazy<List<Bar>> Bars { get; private set; }

    public MyClass() {
      Bars = new Lazy<List<Bar>>(async () => await LoadBars(), true);
    }

    private async Task<List<Bar>> LoadBars() {
      return await Util.Database.GetBarsAsync(Id);
    } 
  }

此集合占用大量内存,因此我只希望在需要时加载它。

我得到的错误是在=>上:

  

无法将异步Lambda表达式转换为委托类型   'Func>'。异步lambda表达式可能会返回void,Task或   任务,都不能转换为'Func>'

1 个答案:

答案 0 :(得分:0)

简短回答;您不能(没有各种技巧),但是可以这样做:

public class MyClass {
    public int Id { get; set; }
    public Lazy<Task<List<Bar>>> Bars { get; private set; }

    public MyClass() {
      Bars = new Lazy<Task<List<Bar>>>(() => LoadBars(), true);
    }

    private Task<List<Bar>> LoadBars() {
      return Util.Database.GetBarsAsync(Id);
    } 

    private async SomethingElseAsync() {
        List<Bar> bars = await Bars.Value;
    }
}