如何使用async-await加载集合? [重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

我如何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或Task,其中任何一个都不能转换为'Func>'

c# async-await lazy-loading
1个回答
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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.