c# - 异步 lambda 并且不能将 Task.Task.List<Object> 隐式转换为 List<Object>

标签 c# asynchronous lambda

我有以下类(class)

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 调用一起工作?

谢谢。

最佳答案

目前,您正在将项目序列投影到一组任务中,这些任务完成后可以提供您的 View 模型。如果您想获得这些 View 的序列,则需要(异步地)等到这些任务全部完成。您可以使用 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
    }));

关于c# - 异步 lambda 并且不能将 Task.Task.List<Object> 隐式转换为 List<Object>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26659903/

相关文章:

c# - 为电子邮件附件使用多个内存流

c# - 实现抽象工厂模式的正确方法?

java - 通过 TCP java (Android)/C# 进行私钥加密

c# - 微软图: how to get all groups reusing the token generated through ADAL

c# - T 未知时如何创建 Func<T, bool>

c++ - boost ASIO async_read_until 不编译 ASIO ssl 客户端示例

Java Google 数据存储异步调用

spring - 如何在执行许多异步后台任务时保持网络服务器响应

.net - 没有智能感知的VB.Net Lambda表达式

java - 比较 Java 的 lambda 表达式和 Swift 的函数类型