.NET에서 Async 프로그램밍 변천사(?)
안녕하세요. 오늘은 C# 5.0에 새로 들어가는 async 기능에 대해 글을 쓰기 전에 .NET 에서 async/multi thread 에 대한 지원이 어떻게 진화 되어 왔나 써 볼까 합니다.
우선, 보다 자세한 내용은 MSDN magazine 2010/9 월호에 기사로 나와 있으니 함 가셔서 보시길 바랍니다. 비교적 쉽고 자세하게 어떤 비동기 식이 있나 설명 되어져 있습니다.
일단 간단하게 위의 기사를 요약하면, 현재 C# 5.0 까지 나온 비동기/멀티 스래드 지원 기반은
- ThreadPool/UserWorkItem
- 가장 low-level이며 원시적이고 비효율적인 방법으로 멀티 스래드와 비동기 둘부분에 다 사용 가능합니다.
- Event-Based
- UserWorkItem 보다 약간 더 발전된 방법으로 multi-thread보단 async적 용도로 많이 쓰입니다.
- IAsynResult
- C# 과 같은 언어에 anonymous method, lambda와 같은 요소가 지원되면서 coninuation-passing style로 사용하기가 무척 쉬워져 요즘 많이 쓰는 방식입니다.
- TPL
- 1,2,3 보다 high-level한 framework로 기존 1,2,3 번 방식과 달리 많은 low-level 관련된 작업들을 (synchronization, marshaling, etc) 프레임에서 해 줍니다.
- C# asnyc/await
- TPL을 바탕으로 비동기를 지원해 주는 C# 5.0에 새로 들어갈 기능입니다.
이렇게 5 가지 입니다.
위와 같이 여러가지 방식이 나온 이유는 이 쪽 방면이 시간이 지나면서 점차 진화되었기 때문입니다., C# 1.0 에서도 뭔가 있었던거 같은데, 잘 기억이 안나네요. 하여간 .NET 2.0 부터 본격적으로 async 를 좀 더 쉽게 지원하기 위한 여러가지 노력들이 시작됩니다.
맨 처음에 multi thread 를 쉽게 하기 위함이 먼저 였고요. 따러서 가장 기본적인 서비스인 thread pool과 io thread pool 이 CLR 단에서 지원되고, 그 바탕 위에 가장 단순하고 초기적인 event-base의 asynchronous programming 방식이 지원됐습니다. 그 후에 anonymous method (C# 2.0) 와 lambda (C# 3.0) 가 언어에서 지원 되면서 IAsyncResult가 지원/각광 받게 됐고, C# 4.0에서는 기타 기존의 low-level 방식 보다 한단게 높은 high level에서 async를 할수 있는 TPL framework가 제공 되게 됐습니다. C# 5.0에서는 이 TPL를 바탕으로 비동기 프로그램밍을 언어 자체에서 지원하게 될 예정입니다.
C# 5.0에 새로 들어 가는 async 기능은 제 예전 post와 앞으로 할 post들을 보시기 바랍니다.
…
하여간 이게 .NET C# 에서의 비동기 프로그램밍의 변천사 입니다.
그럼 수고!
(정확히는 hoons 이라는 곳의 어떤 분이 C#에서 지원 되는 비동기 방식에 대해 질문을 올리셔서 그에 대한 답변으로 썼던 글지만, 하여간 제 블로그로 옮겼습니다.)