상세 컨텐츠

본문 제목

Task/async await 와 .Result 테스트 끄적거림

C#

by happynuri 2022. 2. 16. 11:23

본문

 

PostAsync를 실행 하면서 async await에 대해서 정리 한 생각을 적어 본다.

1. async await

내가 이해한 async await 구문은 일반적인 비동기 방식으로

 

문법으로 async와 await가 한 쌍으로 아래와 같이 쓰이면

 

function async 함수명1()

{

 await 함수명2

}

 

비동기 방식을 사용할때 

간단하게, 2줄로, 동기(순차적인) 방식으로 실행 되는 것처럼 보이게 코딩 하는 비동기 호출으로

이해 하고 있다. (구문의 가독성을 위한 간단한.)

 

2. void 와 Task<TResult> 

비동기 호출에서는 Task클래스(작업기반 비동기 패턴) 를 사용할 수 있다. 

비동기 실행을 할때 반환값을 받는 경우는 Task<TResult>를 사용한다.

 

참고 : https://docs.microsoft.com/ko-kr/dotnet/api/system.threading.tasks.task?view=net-6.0 

 

Task 클래스 (System.Threading.Tasks)

비동기 작업을 나타냅니다.Represents an asynchronous operation.

docs.microsoft.com

 

 

Task를 사용할때 값 반환이 없을때는 async 메소드를 void로 선언 한다 던가

async void FunctionName1()

{

}

 

반환값이 있을때는 Task<TResult>를 사용해서,

비동기 메소드의 내부 값을 return 받아서, 사용할 수 있다.

 

static async Task<int> test()

{

var task1 = new Task<int>(() =>

{

 int sumA = 0;

   for (int i = 0; i<10 ; i++){

      Console.WriteLine("a="+i);

      sumA += i;

      Thread.Sleep(500);

    }

});

task1.Start();

await task1;

Console.WriteLine("task1.Result = "+task1.Result);

return 999;

}//end method

 

Main() 메소드에서 아래를 실행

var task = test();

Console.WriteLine("1");

task.Wait();

Console.WriteLine("2");

int a = task.Result ;

Console.WriteLine("3");

Console.Read();

 

test() 메소드 실행 해서 내부에서 "a=0" 부터 인쇄를 하면서,

Main에서 "1" 인쇄 하고, 

task.Wait()를 했기때문에, test()메소드가 끝날때까지 기다렸다가

("a=9"까지 모두 찍고)

 

"2"를 찍고 결과값을 리턴한다.

 

async await 를 할때 Wait()를 써야, return 까지 간 결과 값을 확인 할 수 있다.

 

 

-----------------

 

 

 

3. 아래와 같이 .Result를 사용했는데

async await로 구문을 바꿔야 하는 이유가 생겼다. 

 

.Result의 경우는 PostAsync로 실행을 해서 비동기 방식으로 실행은 했는데, 즉각적인 값 리턴이 있을때만, .Result 로 결과값을 받아 오는 것이고, 

만약, 시간이 조금 더 걸렸다가 값 리턴이 되었다면 결과값이 없는 상태에서 .Result를 호출 하면

exception이 발생 한다고 함.

 

그래서 예제가 

HttpResponseMessage result = await client.PostAsync(url, Content);

string resultContent = await result.Content.ReadAsStringAsyn();

 

이렇게 하면 됨.

 

관련글 더보기

댓글 영역