При работе с тасками часто возникает такая задача: у нас есть набор входных данных и для обработки каждого элемента используется длительная операция.
Можно подойти к этой задаче в лоб. Крутим цикл, запускаем таски, обрабатываем результаты по одному:
private Task<Weather> GetWeatherForAsync(string city)
{
Console.WriteLine("[{1}]: Getting the weather for '{0}'", city,
DateTime.Now.ToLongTimeString());
return WeatherService.GetWeatherAsync(city);
}
[Test]
public async Task ProcessOneByOneNaive()
{
var cities = new List<string> { "Moscow", "Seattle", "New York" };
var tasks =
from city in cities
select new { City = city, WeatherTask = GetWeatherForAsync(city) };
foreach (var entry in tasks)
{
var wheather = await entry.WeatherTask;
ProcessWeather(entry.City, wheather);
}
}
private void ProcessWeather(string city, Weather weather)
{
Console.WriteLine("[{2}]: Processing weather for '{0}': '{1}'", city, weather,
DateTime.Now.ToLongTimeString());
}
Здесь мы обращаемся к некоторому сервису погоды, для получения температуры в каждом городе, затем обрабатываем полученные результаты путем вывода города и температуры на экран.