int result = testtask .Result; 는 테스크가 끝나서 결과를 반환할 때까지 대기를 탄다.
2. 테스크 끝난후 다른 테스크 실행하기 .
방법은 두가지
2-1 . GetAwaiter사용
Task
var awaiter = testtask.GetAwaiter(); // 이 awaiter는 테스크가 끝난건지 알수 있는 상태자체이다.
awaiteer.OnCompleted( () =>
{
Console.Writeline("Second Done")
int result = awaiter.GetResult(); // testask의 결과값은 awaiter.GetResult() 이다.
Console.Writeline(result ) ;
});
** 선행 작업에서 예외 발생시 awaiter.GetResult()에서 그 예외가 그대로 발생.
** 비제네릭시 awaiter.GetResult()는 void반환. 오직 예외만 전달받는다는 기능이 있는거임.
** 선행 테스크와 같은 쓰레드에서 실행을 시키고 싶을때는
var awaiter = testask.ConfigureAwait(False).GetAwaiter();
이렇게 쓰면 된다. 이러면 단순히 선행 테스크와 코드가 합쳐지는 거라고 보면 된다.
2-2 ContinueWith
testtask.ContinueWith( firsttask =>
{
int result = firsttask.Result;
Console.Writeline(result ) ;
})
**여기서는 익셉션이 전파가 안된다. 따로 작성을 해줘야 한다. (선행 테스크에서 예외 발생시 그걸 따로 처리해서 전달을 하던지 해야 한다. )
** 같은 쓰레드에서 실행시키려고 하면 TaskCOntinueousOption 으로 ExecuteSynchronously를 지정해 줘야 한다.
Task t2= testtask.ContinueWith( firsttask =>
{
int result = firsttask.Result;
Console.Writeline(result ) ;
}
, TaskContinuationOptions.ExecuteSynchronously);
3. Delay
Task.Delay(400).GetAwaiter().OnComplete( () => Console.Writeline(""));
Task.Delay(400).ContinueWith( ftask => Console.Writeline(""));
4. await async - TaskCompletionSource 로 작업의 연결, 완료 등을 관리해야 하면 힘들어서 이것들이 등장했다.
var result = await 표현식;
문장들
은 원래는 다음과 같다.
var awaiter = 표현식.GetAwaiter();
awaiter.ConCompleted(()=>
{
var result = awaiter.GetResult();
문장들
})
댓글 없음:
댓글 쓰기