【问题标题】:Async lambda and cannot implicitly convert Task.Task.List<Object> to List<Object>异步 lambda,不能将 Task.Task.List<Object> 隐式转换为 List<Object>
【发布时间】:2014-10-30 17:46:14
【问题描述】:

我有以下课程

public PhoneModel
{
    int PhoneID;
    string PhoneType;
    string PhoneNumber;
}
public ContactModel 
{
    int ContactID;
    string FirstName;
    string LastName;
    List<PhoneModel> PhoneNumber;
}

我需要显示一个联系人列表,其中包含每个联系人的所有电话号码。

var contactList = await ContactBLL.GetContactList();
IEnumerable<ContactViewModel> contacts = contactList.ToList().ConvertAll(
    async c => new ContactViewModel
    {
        phones = (await ContactBLL.GetContactPhones(c.ContactID)).ToList(),
        firstName = c.FirstName, 
        lastName = c.LastName
    });

我目前收到编译错误提示“无法将类型 'System.Threading.Tasks.Task.List 隐式转换为 IEnumerable....” 但是,如果没有 async 调用来获取电话列表,它将起作用(当然没有电话)。我可以将async 函数GetContactPhones() 更改为同步函数,它将按预期工作。我的问题是有没有办法使上面的代码与async 调用一起工作?

谢谢。

【问题讨论】:

    标签: c# asynchronous lambda


    【解决方案1】:

    目前,您将项目序列投影到任务集合中,这些任务完成后可以提供您的视图模型。如果您想拥有这些视图的序列,则需要(异步)等到这些任务全部完成。您可以使用Task.WhenAll 来执行此操作:

    var contacts = await Task.WhenAll(contactList.Select(
        async c => new ContactViewModel
        {
            phones = (await ContactBLL.GetContactPhones(c.ContactID)).ToList(),
            firstName = c.FirstName, 
            lastName = c.LastName
        }));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-07
      • 2013-04-01
      相关资源
      最近更新 更多