20220516 Asynchronous Programming
title: "Asynchronous Programming" date: "2022-05-16"
modified: "2022-05-16"
뭔가 의미없지만 의미있는 정리
면접때 뭘 물어보면 좋을까
비동기 프로그래밍(Asynchronous Programming)
- 레벨1기초 : 1.1. 묻고자 하는바 : 비동기 프로그래밍이 무엇인지 아는가? 1.2. 정답 - 주요 키워드 중심으로 :
- 순차적으로 작업을 수행하는 것이 아니라 큰 작업을 개별 스레드(작업)으로 수행하여 복수의 작업을 동시에 수행
- 동기 프로그래밍(Synchronous Programming)의 경우 한 작업 후 다음 작업이 수행되어야 하나, 비동기 프로그래밍의 경우 동시에 여러 작업을 수행할 수 있어 실행 속도 개선
- 예를 들어, 동기 프로그래밍의 경우 GUI환경에서 큰작업(파일로드 등)을 수행할 경우 작업이 종료될때까지 화면이 멈추지만, 비동기 프로그래밍으로 코딩을 하면 화면 쓰레드와 파일 로드 쓰레드가 별도 수행되며, 파일로드가 종료될 때 해당 결과를 화면단에 갱신하면 되므로 사용성 개선
- 멀티코어가 탑제되는 현대의 운영 환경에서 복수 코어를 활용할 수 있는 방법
- 레벨2 2.1. 묻고자하는 바 - 비동기 프로그램을 과제/프로젝트/결과물에 적용하여 개발한 경험이 있는가? 2.1.1. 상세 시나리오 : 모바일 장치로 파일 카피 모바일 디바이스로 파일을 카피하려고 하는데 동기 프로그래밍으로 작업되어 있어, 파일 이동 중 화면이 멈추는 현상이 있다. 파일 이동 중에도 화면 갱신 및 이벤트를 정상적으로 수신하려면 어떻게 하면 좋을까? 자신이 알고 있는 프레임워크/라이브러리/구조를 이용하여 전체 구조를 잡고 코딩하시오. 2.2. 정답 - 주요 키워드 중심으로 :
- 태스크에 대한 생성, 실행, 반환, 에러에 대한 입/출력 구조와 문법을 잘 이해하고 있는가?
- 태스크 구조체
System.Threading.Tasks.Task
- 제어 흐름
- 태스크 종료 후 다음 작업 수행
//테스트 수행 결과를 기다려서Toast toast = await toastTask;//원하는 동작 수행
- 콜백을 넣어서 메인 흐름은 진행하고, 작업 수행 후 콜백 수행
//테스트 수행 결과를 기다려서foreach(Task recommendation in recommendations){var ignored = recommendation.ContinueWith( /*콜백함수를 넣어서 태스크 종료 후 연속 수행*/ );}
기타
프레임워크나 런타임에 관계없이 경험을 질문
면접자에 따라 사용해온 환경이 다를 것 같은데 답을 어떻게 적으면 좋을지...
- 레벨3 단순한 로직말고 예외 처리를 수행한 경험이 있는가?
ex) http get으로 데이터를 수신하려고 하는데, 실패 로직은 어떻게 처리?
서버와 통신이 실패한 경우(ex. 4xx 수신)
서버에서 에러를 던진 경우?
실패시 재시도? 화면에 에러처리?
그 경우 빈틈이 없는가? 사용자가 원하는 목표를 달성할 수 있는가?
프로그램이 죽지는 않는가?
ex) 쓰레드를 통하여 파일 로드를 한 후 해당 파일을 화면에 갱신하려고 하는데 파일 읽기에 실패한 경우 어떻게 처리
- 참고
- async 및 await를 사용한 비동기 프로그래밍 : https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/concepts/async/