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(10, returnValue); }
[코드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와 같이 상대적으로 느린 시스템에서 데이터를 컨트롤 하는 부분에서만 비 동기를 사용할 것을 적극 권장하는 바이다.
'.Net Framework' 카테고리의 다른 글
[C# Snippet]Task-based Asynchronous Pattern - ContinueWith (0) | 2013.03.08 |
---|---|
[C# Snippet]Task-based Asynchronous Pattern Task.Run 메소드 (0) | 2013.03.08 |
[Utility]Sysinternals Utilities Index (0) | 2013.03.04 |
[Utility]Sysinternals System Information Utilities (0) | 2013.03.04 |
[Utility]Sysinternals Process Utilities (0) | 2013.03.04 |