public static Task<Weather> GetWeatherAsync(string city)
        {
            return Task.Run(
                async () =>
                {
                    await Task.Yield();
                    Console.WriteLine("Starting getting the weather for '{0}'", city);

                    // Faking the temerature by city name length:)

                    // Each task should take random amount of time
                    var interval = 1 + new Random(Guid.NewGuid().GetHashCode()).Next(7);
                    Console.WriteLine("Sleeping for {0}sec", interval);

                    await Task.Delay(TimeSpan.FromSeconds(interval));

                    var result = new Weather(city.Length);
                    Console.WriteLine("Got the weather for '{0}'", city);
                    return result;
                });
        }
 private void ProcessWeather(string city, Weather weather)
 {
     Console.WriteLine("[{2}]: Processing weather for '{0}': '{1}'", city, weather,
         DateTime.Now.ToLongTimeString());
 }