더북(TheBook)

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() 메서드로 묶어 줍니다. 또 비동기 메서드는 asyncawait 키워드 조합으로 호출하면 됩니다.

여기서 한 가지 더 기억할 점은 동기를 포함한 비동기 프로그램도 역시 비동기 프로그램이라는 것입니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.