2017년 6월 28일 수요일

[C#] Task Tip

1. Task testtask = Task.Run( () => 3); 시 

int result =  testtask .Result;  는 테스크가 끝나서 결과를 반환할 때까지 대기를 탄다.

2. 테스크 끝난후 다른 테스크 실행하기 .

방법은 두가지

2-1 . GetAwaiter사용

 Task task = Task.Run( () => 3);

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();
문장들
})

댓글 없음:

댓글 쓰기