티스토리 뷰

     C#에 관해 그 동안 익혀왔던 것들을 조금씩이라도 블로그에 정리해보기로 마음 먹었을 때, 가장 먼저 하고 싶으면서도 망설여 졌던 주제가 Await, Async이다. 아무튼 오늘의 포스팅을 통해, 좀 더 개념을 명확히 이해할 수 있게 되길, 다음에 읽었을 때는 더 많이 알게 되었길 바래본다. Go for it!

1. 비동기란 무엇인가?

동기적인 작업(왼쪽)과 비동기적인 작업(오른쪽)

     위 사진은 비동기 프로그래밍에 현실적인 예이다. 우리는 바쁜 아침 시간, 조금이라도 더 풍성하게 먹기위해, 비동기적으로 아침을 차린다. 후라이팬에 불을 올리고, 토스트기에 빵을 넣고, 후라이팬이 데워지면 기름을 두르고 계란을 넣는다. 이 때, 계란을 부치는 일과 빵을 굽는 일은 비동기적으로 일어나도 괜찮다. 나중에 이를 합쳐서 샌드위치를 만들어 먹겠다고 하면 동기화가 필요하겠지만(await taskall), 바쁜 아침 먼저 만들어진것부터 입에 밀어넣으면 좋지 않을까? (아몰랑)

 

    프로그래밍을 하다보면 '처리하는데 일정 시간이 필요하지만, 사용자가 꼭 기다릴 필요는 없는 일'들이 있다. 예컨데, 내가 쇼핑을 하다가 물건을 장바구니에 넣었는데, 내가 선택한 물건을 장바구니 DB에 넣고 장바구니에 성공적으로 들어갔다는 알림이 뜨는 찰나의 시간에도 나는 페이지를 스크롤하면서 더 많은 품목을 보고싶다. 이렇듯 흔하게 쓰이는 비동기 프로그래밍은 많은 언어에서 지원하고 C#에서는 Async, Await 키워드로 보다 쉽게 제공하고 있다. 

 

   MDSN 에서는 I/O 작업을 요구하는 일에 비동기 프로그래밍을 활용하는 것들이 좋다고 설명하고 있다. 

  • 네트워크 데이터 요청
  • 데이터베이스 엑세스
  • 파일시스템 읽기 및 쓰기
Don't block, await insteed 

   개인적으로 내가 생각하는 비동기 프로그래밍의 장점은 호출 스레드가 Blocking 되지 않고 기다린다는 것이다. 비동기 함수는 호출 즉시 반환되고(NonBlocking), 그 안에 존재하는 await 작업 이후에 코드들은 동기화 되어 동작한다. 신기한것은 await 하고있는 스레드가 UI스레드라도 UI가 먹통이 되지는 않는다는 것이다.!

 

 

2. Await, Async는 예제

인터넷에서 4K이미지를 가져와 화면에 표시해주는 간단한 어플리케이션을 작성해보았다. 

 

2-1. 4K이미지를 찾아서 링크 주소 복사

 

2-1. 해당 링크를 가져와서 Bitmap 이미지로 만들기

private async void Import_Click(object sender, RoutedEventArgs e)
{
    var path = "https://images.pexels.com/photos/460621/pexels-photo-460621.jpeg?cs=srgb&dl=pexels-pixabay-460621.jpg&fm=jpg";
    var image = await ToImageAsync(path);
    MyImage.Source = image;
}

private async Task<ImageSource> ToImageAsync(string path)
{
    var httpClint = new HttpClient();
    var imageBytes = await httpClint.GetStreamAsync(path);

    var bitmapImage = new BitmapImage();
    bitmapImage.BeginInit();
    bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
    bitmapImage.StreamSource = imageBytes;
    bitmapImage.EndInit();

    return bitmapImage;
}

2-3. 결과 화면

명시적으로 테스크를 실행하지 않않지만 버튼 Hover이벤트는 막히지 않고 동작한다. 

첨언하자면, BitmapImage를 만드는 부분은 UI 스레드에서 작업해야하기 때문에 오래 걸릴 것 같다면, 별도 프로그래스 처리를 해주는게 좋다.

 

* 아래 링크 가면 내가 작성한 예제보다 더 좋은 예제가 많이 있어 참고하기 좋다. 그럼 이만:)

https://docs.microsoft.com/en-us/dotnet/csharp/async

이건 내가 참고하려고 첨부한 사진. await 테스크 예시.

3. Reference

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/

 

Asynchronous programming in C#

An overview of the C# language support for asynchronous programming using async, await, Task, and Task

docs.microsoft.com

https://kangworld.tistory.com/25

 

[C#] async await 예제 코드 #2 (+ 동기 비동기의 개념)

async await 두 번째 편이자 마지막 편! 빵! 끗! 인트로 이틀간 밤을 새우며 stackoverflow와 저명한 C# 개발자의 개인 홈페이지에서 글을 읽으며 async await 개념을 정리했다. 아직도 궁금한 부분이 많고

kangworld.tistory.com

https://cypsw.tistory.com/entry/C-Task-Wait-vs-await-%EC%B0%A8%EC%9D%B4%EC%A0%90

 

[C#] Task .Wait() vs await 차이점

Task.Wait과 await의 차이점 Stack Overflow에서 발견한 흥미로운 질문과 답변입니다. set 출처: https://stackoverflow.com/questions/9519414/whats-the-difference-between-task-start-wait-and-async-await ka..

cypsw.tistory.com