Я бы хотел убедиться, что «ожидание» на CreatePicture не мешает мне сделать это.
Это не так.
Если я правильно понимаю, Task.WhenAll () не затронуты двумя ожидаемыми задачами внутри CreatePicture (), потому что GetPictureForEmployeeAsync () не ожидается. Я прав насчет этого?
Да и нет. WhenAll
никоим образом не ограничен ожидаемыми задачами в CreatePicture
, но это не имеет никакого отношения к тому, ожидается ли GetPictureForEmployeeAsync
или нет. Эти две строки кода эквивалентны с точки зрения поведения:
return Task.WhenAll(employees.Select(employee => GetPictureForEmployeeAsync(employee, tags)));
return Task.WhenAll(employees.Select(async employee => await GetPictureForEmployeeAsync(employee, tags)));
Я рекомендую прочитать мое async intro , чтобы лучше понять, как async
и await
работают с задачами.
Кроме того, поскольку GetPictures
имеет нетривиальную логику (GetRepositoryQuery
и оценку tags["gender"]
), я рекомендую использовать async
и await
для GetPictures
, как таковые:
public async Task<Picture[]> GetPictures(IDictionary<string, string> tags)
{
var query = documentRepository.GetRepositoryQuery();
var employees = query.Where(doc => doc.Gender == tags["gender"]);
var tasks = employees.Select(employee => GetPictureForEmployeeAsync(employee, tags)).ToList();
return await Task.WhenAll(tasks);
}
В качестве заключительного замечания вы можете найти свой очиститель кода, если не пропустите «задачи, которые ожидаются» - вместо этого сначала await
их и передайте их значения результата:
async Task<Picture> GetPictureForEmployeeAsync(Employee employee, IDictionary<string, string> tags)
{
var base64PictureTask = blobRepository.GetBase64PictureAsync(employee.ID.ToString());
var documentTask = documentRepository.GetItemAsync(employee.ID.ToString());
await Task.WhenAll(base64PictureTask, documentTask);
return CreatePicture(tags, await base64PictureTask, await documentTask);
}
static Picture CreatePicture(IDictionary<string, string> tags, string base64Picture, Employee document)
{
return new Picture
{
EmployeeID = document.ID,
Data = base64Picture,
ID = document.ID.ToString(),
Tags = tags,
};
}