我在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函数来保持异步。
有人可以帮我做吗?
答案 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;
}