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를 사용할때 값 반환이 없을때는 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();
이렇게 하면 됨.
댓글 영역