-
[.NET] 비동기(async, await) 방식의 메소드를 동기 방식으로 안전하게 호출하기.NET/개념 및 유용한 팁 2023. 1. 4. 23:02반응형
가장 좋은 것은 대세에 따라 비동기 방식으로 개발하는게 좋지만, 현 회사에서 ASP.NET Core를 동기방식으로 개발해놔버린지라 좋은 도구를 개같이 쓰거나, 옛날 라이브러리의 방식을 뒤져서 쓰거나 하는 어려움이 따르고 있다.
왠만하면 참겠으나, HttpClient 놔두고 WebRequest 써야 되는 상황이 나오니 머리에 꼭지 돌 지경이다. 하여 동기방식으로 안전하게 호출하는 방식을 찾아보았다.
.NET 7.0 이하 버전 기준, 비동기 함수를 .Result 프로퍼티를 통해 직접적으로 결과를 받게끔 개발하게 되면 랜덤한 상황에 Thread 교착상태가 발생하여 갑자기 동작이 멈추는 이슈가 발생할 수 있다.
// 이와 같은 호출은 큰 위험이 따른다. var res = _factory.CreateClient().GetAsync("http://localhost:8088").Result;
이를 안전하게 호출할 수 있는 방법을 찾다가 MS 아티클에 정보가 있어 첨부한다. 2017년도 기준이라 NET Core 3.1 기준으로 유용한진 추가적인 확인이 필요할 듯 하지만, 도저히 참을 수 없는 빡침을 견뎌가면서 하기 힘들 지경이라 도입할까한다.
// MS 아티클 피셜 이렇게 하라고 한다. var task = Task.Run(() => _factory.CreateClient().GetAsync("http://localhost:8088")); task.Wait(); var res = task.Result;
안되면 짜르라지.... 실업급여나 타자.
출처
ASP.Net–Do not use Task .Result in main context | Microsoft Learn
반응형'.NET > 개념 및 유용한 팁' 카테고리의 다른 글
[ADO.NET] 프로시저 호출 시 the Size property has an invalid size of 0 오류 일어날 때 확인 사항 (0) 2023.04.20 [.NET] The last access/last write time on file 빌드오류 (0) 2023.03.12 [.NET] Benchmark - Count() vs Any() (0) 2023.01.03 [.NET] ASP.NET Core 및 비동기(async, await) 프로그래밍 개발에 도움이 되는 설명 사이트 (0) 2022.12.26 [EFCore] EF Core Tool 로 C# 모델 클래스 -> DB 마이그레이션 하기 (0) 2022.08.07