通过保持异步将对象分配给对象任务内部的某个值

时间:2018-10-14 10:59:35

标签: c# .net .net-core task task-parallel-library

我在TPL方面没有很多专业知识。

请考虑以下情形:

我有以下课程:

public class Contact
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string EmailAddress { get; set; }
    public Company Company { get; set; }
}

public class Company
{
    public int Id { get; set; }
    public string Name { get; set; }
}

现在,我有以下代码

Task<Contact> contactDetails = r.FirstOrDefaultAsync<Contact>();
Task<Company> companyDetails = r.FirstOrDefaultAsync<Company>();

现在,我要通过companyDetails结果填充Company属性。这样的东西(请在下面检查)

contactDetails.Company = companyDetails 

我希望不调用await函数来保持异步。

有人可以帮我做吗?

1 个答案:

答案 0 :(得分:0)

假设您创建如下所示的异步方法:

public async Task<Contact> GetContact()
{
    R r = new R();

    Contact contactDetails = await r.FirstOrDefaultAsync<Contact>();
    Company companyDetails = await r.FirstOrDefaultAsync<Company>();

    contactDetails.Company = companyDetails;

    Console.WriteLine("3");
    return contactDetails;
}

直到您等待此GetContact,此操作才会执行。因此,例如,如果我们使用以下代码来调用它:

Console.WriteLine("1");
Task<Contact> getContactTask = GetContact();
Console.WriteLine("2");
Contact contact = await getContactTask; // the code is now executed
Console.WriteLine("4");

控制台将显示:

1
2
3
4

根据您的评论,我认为这是您想要的。在您使用GetContact方法调用await之前,获取联系和获取公司将不会执行。

此外,如果您想同时执行获取联系和获取公司并行性,则可以使用以下命令:

public async Task<Contact> GetCompanyParallel()
{
    R r = new R();

    Task<Contact> contactDetailsTask = r.FirstOrDefaultAsync<Contact>();
    Task<Company> companyDetailsTask = r.FirstOrDefaultAsync<Company>();

    await Task.WhenAll(contactDetailsTask, companyDetailsTask);

    Contact contactDetails = await contactDetailsTask;
    contactDetails.Company = await companyDetailsTask;

    return contactDetails;
}