56.6 Task.FromResult( )를 사용하여 비동기로 반환값 전달하기
비동기 호출을 사용하여 오늘 날짜부터 5일간 날씨와 온도 리스트를 랜덤하게 반환하는 메서드를 비동기 Main()에서 호출하는 예제는 다음과 같습니다. 닷넷 API에서 제공하는 Async 메서드가 아닐 때는 Task.FromResult() 메서드로 묶어 반환할 수 있습니다.
Task.FromResult( ) 메서드를 사용하여 비동기로 반환값 전달: WeatherForecastApp.cs
using System; using System.Linq; using System.Threading.Tasks; public class WeatherForecast { public DateTime Date { get; set; } public int TemperatureC { get; set; } public int TemperatureF { get; set; } public string Summary { get; set; } } public class WeatherForecastService { private static string[] summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; public Task<WeatherForecast[]> GetForecastAsync(DateTime startDate) { var rng = new Random(); return Task.FromResult(Enumerable.Range(1, 5).Select(idx => new WeatherForecast { Date = startDate.AddDays(idx), TemperatureC = rng.Next(-20, 55), Summary = summaries[rng.Next(summaries.Length)] }).ToArray()); } } class WeatherForecastApp { static async Task Main() { var service = new WeatherForecastService(); var forecasts = await service.GetForecastAsync(DateTime.Now); Console.WriteLine("Date\tTemp. (C)\tTemp. (F)\tSummary"); foreach (var f in forecasts) { Console.WriteLine($"{f.Date.ToShortDateString()}\t" + $"{f.TemperatureC}\t{f.TemperatureF}\t{f.Summary}"); } } }
실행 결과
Date Temp. (C) Temp. (F) Summary 2020-03-24 -20 0 Chilly 2020-03-25 45 0 Balmy 2020-03-26 -19 0 Scorching 2020-03-27 48 0 Mild 2020-03-28 -12 0 Bracing
자신만의 비동기 메서드를 만들 때 특정 결괏값을 Task<T>로 돌려주면 Task.FromResult() 메서드로 묶어 줍니다. 또 비동기 메서드는 async와 await 키워드 조합으로 호출하면 됩니다.
여기서 한 가지 더 기억할 점은 동기를 포함한 비동기 프로그램도 역시 비동기 프로그램이라는 것입니다.