使用 async 关键字标记 lambda 表达式

Posted

技术标签:

【中文标题】使用 async 关键字标记 lambda 表达式【英文标题】:Marking lambda expression with async keyword 【发布时间】:2019-09-14 21:53:10 【问题描述】:

我有一个名为 GetParentViewModel 的函数,如下所示,它将父模型类转换为 ParentViewModel,以便可以将其发送到视图。

   public class Parent
   
        public int ParentId  get; set; 
        public string ParentName  get; set; 
        public IEnumerable<Child> children get; set; 
   

   public class Child
   
        public int ChildId  get; set; 
        public string ChildName  get; set; 
        private IEnumerable<Friend> friends  get; set; 
        public IEnumerable<Hobby> hobbies  get; set; 
   

   public async Task<List<Hobby> GetHobbies(int childId)
   
       return await..
   

   public async Task<List<Friend> GetFriends(int childId)
   
       reutrn await..
   

   public async Task<ParentViewModel> GetParentViewModel(Parent parentModel)
   
      return new ParentViewModel() 
      
         ParentId = parentModel.ParentId,
         ParentName = parentModel.ParentName,
         children = parentModel.children.Select(item => new ChildViewModel()
         
             ChildId = item.ChildId,
             ChildName = item.ChildName,
             hobbies = await GetHobbies(item.ChildId),
            friends = await GetFriends(item.ChildId)
          ); 
       ;
   

当我尝试在 GetParentViewModel 中调用 GetHobbies 和 GetFriends 的异步函数时,出现错误

   CS4034: The ‘await’ operator can only be used within an async lambda expression. Consider marking this lambda expression with the async modifier.

我尝试了各种方法,尝试在“Select(item=>..”之前将其标记为异步,但没有成功,在“children = await parentModel”之后有一个 await 关键字,但它似乎不起作用。 ..有人可以帮忙..

我通过编写一个单独的异步函数来获取孩子,但不是高于它。大家有什么建议

谢谢。

【问题讨论】:

Where do I mark a lambda expression async?的可能重复 抱歉做了一个小改动以显示代码返回 ParentViewModel.. 干杯 【参考方案1】:

更新: 我建议重构如下:

    public async Task<ParentViewModel> GetParentViewModel(Parent parentModel)
    
        var childrens = new List<ChildViewModel>();
        foreach (var item in parentModel.children)
        
            var hobbies = await GetHobbies(item.ChildId);
            var friends = await GetFriends(item.ChildId);

            var child = new ChildViewModel
            
                ChildId = item.ChildId,
                ChildName = item.ChildName,
                hobbies = hobbies,
                friends = friends
            ;

            childrens.Add(child);
        

        return new ParentViewModel
        
            ParentId = parentModel.ParentId,
            ParentName = parentModel.ParentName,
            children = childrens
        ;
    

【讨论】:

谢谢,但我收到此错误 - 无法将类型 'System.Collections.Generic.IEnumerable>' 隐式转换为 'System.Collections.Generic。 IEnumerable'。存在显式转换(您是否缺少演员表?) 谢谢你.. 是的,干杯,我想,我已经做到了,并得到了这个工作,但想知道如何让我在上面的代码中显示的方式工作.. 也请参阅这个 SO 问题:***.com/questions/13046096/can-not-await-async-lambda

以上是关于使用 async 关键字标记 lambda 表达式的主要内容,如果未能解决你的问题,请参考以下文章

错误:await 表达式只能在异步函数中使用。尝试用“async”或“async*”标记函数体

异步CTP(Async CTP)为什么那样工作?

async Task.Run lambda 表达式在 Android 上使 Unity AR 应用程序崩溃,但在 iOS 上运行良好

将 Func 委托与 Async 方法一起使用

C#新特性

java7和java8有啥区别