Присвойте объект некоторому значению внутри Задачи объекта, поддерживая асинхронность - PullRequest
0 голосов
/ 14 октября 2018

Я не очень разбираюсь в 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>();

Теперь я хочу заполнить свойство Company результатом companyDetails.что-то в этом роде (пожалуйста, проверьте ниже)

contactDetails.Company = companyDetails 

Я хочу сделать это без вызова функции await для поддержания асинхронности.

Может кто-нибудь, пожалуйста, помогите мне сделать это?

1 Ответ

0 голосов
/ 15 октября 2018

Допустим, вы создали асинхронный метод, как показано ниже:

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

В соответствии с вашим комментарием, я думаю, это то, что вы хотите.Получить контакт и получить компанию не удастся, пока вы не вызовете await для метода GetContact.

Также, если вы хотите выполнить и получить контакт, и получить параллель компании, вы можете использовать следующее:

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;
}
...