본문 바로가기

C#

[C#] async void / Task


공통점
* 둘다 메소드 본문이 다 실행되기도 전에 리턴한다. 정확히는 첫번째 await 를 만나기 전까지는 계속 실행되고, 첫번째 await를 만나면 리턴한다.

void 의 경우
* 익셉션이 발생하면 UnhandledException으로 간주되고 프로그램이 종료된다. (.NET 런타임이 이 메소드가 익셉션을 내는지 안내는지를 감시한다)

Task 의 경우
* .NET 런타임이 감시하지 않는다. 유저가 예외처리를 해야 함

* 발생한 익셉션은 리턴값 TaskException에 채워진다 

* 또는 await 사용시, 해당 시점에서 익셉션이 발생한다.

* (유저가 예외처리를 해야하지만 암것도 안했을 경우) 익셉션이 발생해도 아무일도 없는 것 처럼 보인다. 

* 암것도 안했을 경우 TaskScheduler.UnobservedTaskException 콜백이 실행된다. (익셉션 발생 즉시 실행되지 않고 GC가 Task를 정리하려고 했는데, 유저가 익셉션 처리를 안한 경우에 트리거된다.)




언제 써야 할까

void : 최상위 작업인 경우, 이 메소드는 대기될 필요도 없어야 하고, 실제로 async void는 대기시킬 방법도 없다. async void는 단순히 그냥 함수인데 await 키워드를 쓰고싶은 함수라고 간주하면 된다. 주로 이벤트 핸들러에 사용된다.

Task : 이 메소드는 대기될 수 있다. 이 메소드 호출자가 이 메소드 실행을 기다려야(await) 할 필요가 있는 경우, 메소드 이후에 연속된 작업(ContinueWith)이 있어야 하는 경우. Task는 단순히 Task<Void> 라고 생각하면 된다.


'C#' 카테고리의 다른 글

[C#] Linq.Expression Snippets  (0) 2016.09.22
[C#] Async,Await의 내부  (0) 2016.08.29
[HTTP] 웹소켓 핸드쉐이킹  (2) 2016.06.28
[C#] Mono 환경인지 구분하기  (0) 2016.06.21
[NUnit] Callback 방식의 API 테스트하기  (1) 2016.06.16