C# Task-based Asynchronous Pattern - TAP(2)

async / await keyword

http://msdn.microsoft.com/ko-kr/library/hh873175.aspx

http://msdn.microsoft.com/en-us/library/hh873175.aspx


http://www.albahari.com/threading/part2.aspx#_Thread_Safety


2013/02/26 - [.Net Framework] - [Async]Task-based Asynchronous Pattern - TAP(1) Async #7


 이번 포스트는 지난 시간에 이어 TAP에 대해서 더 깊이 있게 알아 볼 수 있는 시간을 가져 보도록 하겠습니다. 지난 포스트의 마지막 부분에서 외부 시스템에서 정보를 가져오는( I/O, Network, ...)을 통해 예제를 통해 비 동기로 실행하면 총 수행 시간을 절약할 수 있는 방안에 대해 알아 보았다. 이 번에는 .Net framework 4.5가 나오면서 C#이 5.0으로 업그레이드가 되었다. 그러면서 비 동기 컨트롤을 지원하는 키워드인 async/await가 추가 되어 더욱 편리하고 안전하게 사용할 수 있게 되었다. 이제 새로 추가된 기능으로 비 동기 구현을 해 보도록 하자. 

/// <summary>
/// async/await 키워드를 이용해서 비 동기 실행
/// </summary>
[TestMethod]
public async void TAP_AsyncAwait_TestMethod1()
{
    //비 동기 실행을 하지만 결과값이 리턴이 될 때까지 대기 한다.
    var returnValue = await Task.Factory.StartNew(() => 
        {
            Debug.WriteLine("TAP_AsyncAwait_TestMethod1 비 동기 실행 시작");
            Thread.Sleep(1000);
            Debug.WriteLine("TAP_AsyncAwait_TestMethod1 비 동기 실행 종료");
            return 10;
        });
 
    //정상 수행 여부 체크
    Assert.AreEqual(10returnValue);
}

[코드1] async/await로 비 동기 실행

(테스트 프로젝트에서는 정상적으로 실행 되지 않아 아래 Console에서 확인 한다)


class Program
{
    static void Main(string[] args)
    {
        Program p = new Program();
        p.TAP_AsyncAwait_TestMethod1();
 
        Console.ReadKey();
    }
 
    public async void TAP_AsyncAwait_TestMethod1()
    {
        //비 동기 실행을 하지만 결과값이 리턴이 될 때까지 대기 한다.
        var returnValue = await Task.Factory.StartNew(() =>
        {
            Console.WriteLine("TAP_AsyncAwait_TestMethod1 비 동기 실행 시작");
            Thread.Sleep(1000);
            Console.WriteLine("TAP_AsyncAwait_TestMethod1 비 동기 실행 종료");
            return 10;
        });
 
        //값 확인
        Console.WriteLine(returnValue);
            
    

[코드2] Console에서 async/await로 비 동기 실행


 "코드2"에서와 같이 TAP_AsyncAwait_TestMethod 함수의 리턴 타입 앞에 'async' 키워드를 이용해서 이 함수는 비 동기로 수행 되는 메소드라고 알려줘야 한다 이렇게 해야지만 메소드 내부에서 await를 사용할 수 있다. 그리고 메소드 내부에서 비 동기로 수행되는 구문에서 await를 이용해서 결과값을 받아 오면 된다. 이렇게 간단한 규칙만으로 비 동기 실행을 절차적인 모양(기존 절차지향 언어에서 비 동기를 구현 할 때 Context를 맞춰줘야 하는 복잡한 지식 없이 절차 지향의 구문의 모양처럼 작성 하면서 메소드의 동작 방식은 비 동기로 구현 한다)으로 작성 하도록 도와 준다. 한번 직접 실행하여 분석해 보도록 하자. 생각 보다 쉽게 비 동기 지원 메소드를 작성 하고 사용할 수 있다. 


 이 기능은 프레임워크에서 지원되는 기능이 아닌 컴팔일러 단에서 지원하는 기능이며 내부적으로 TAP(1)에 설명된 사항 처럼 Task 객체를 이용해서 비 동기를 구현 하도록 내부적으로 구현 한다. .Net framework 4.5에서는 이렇게 쉽게 비 동기를 지원하는 편리한 기능을 추가 하였다. 그렇지만 모든 메소드를 비 동기로 작성해야 하는 필요성은 없으며 I/O, Network, DB와 같이 상대적으로 느린 시스템에서 데이터를 컨트롤 하는 부분에서만 비 동기를 사용할 것을 적극 권장하는 바이다.

+ Recent posts