ASP.NET 응용 프로그램에 완료하는 데 많은 시간이 소요되는 메서드가 있습니다. 이 메소드에 대한 호출은 사용자가 제공하는 캐시 상태 및 매개 변수에 따라 한 사용자 요청 중에 최대 3 번 발생할 수 있습니다. 각 호출을 완료하는 데 약 1 ~ 2 초가 걸립니다. 메서드 자체는 서비스에 대한 동기 호출이며 구현을 재정의 할 가능성이 없습니다.
따라서 서비스에 대한 동기 호출은 다음과 같습니다.
public OutputModel Calculate(InputModel input)
{
// do some stuff
return Service.LongRunningCall(input);
}
그리고 메서드의 사용법은 다음과 같습니다 (메소드 호출이 두 번 이상 발생할 수 있음).
private void MakeRequest()
{
// a lot of other stuff: preparing requests, sending/processing other requests, etc.
var myOutput = Calculate(myInput);
// stuff again
}
이 방법의 동시 작업을 제공하기 위해 내 측면에서 구현을 변경하려고 시도했으며 여기에 지금까지 온 것이 있습니다.
public async Task<OutputModel> CalculateAsync(InputModel input)
{
return await Task.Run(() =>
{
return Calculate(input);
});
}
사용법 ( "다른 작업 수행"코드의 일부는 서비스 호출과 동시에 실행 됨) :
private async Task MakeRequest()
{
// do some stuff
var task = CalculateAsync(myInput);
// do other stuff
var myOutput = await task;
// some more stuff
}
내 질문은 다음과 같습니다. ASP.NET 응용 프로그램에서 실행 속도를 높이기 위해 올바른 접근 방식을 사용합니까? 아니면 동기 코드를 비동기 적으로 실행하려는 불필요한 작업을 수행하고 있습니까? 두 번째 접근 방식이 ASP.NET에서 옵션이 아닌 이유를 설명 할 수있는 사람이 있습니까 (정말 그렇지 않은 경우)? 또한 그러한 접근 방식이 적용 가능하다면, 현재 우리가 수행 할 수있는 유일한 호출 인 경우 이러한 메서드를 비동기 적으로 호출해야합니까 (완료를 기다리는 동안 수행 할 다른 작업이없는 경우)?
이 주제에 대한 인터넷의 대부분의 기사는 async-await
이미 awaitable
메소드를 제공하는 코드로 접근 방식을 사용 하는 방법을 다루지 만 제 경우는 아닙니다. 여기병렬 호출의 상황을 설명하지 않고 동기화 호출을 랩핑하는 옵션을 거부하는 내 사례를 설명하는 멋진 기사이지만 내 생각에는 내 상황이 바로 그 기회입니다.
도움과 팁에 미리 감사드립니다.
Task.Run
하면 콘텐츠가 스레드 풀에서 가져온 다른 스레드에서 실행됩니다. 그러면 블로킹 호출 (예 : 서비스에 대한 광산 호출)을Run
s 로 래핑 할 필요가 없습니다 . 왜냐하면 메서드 실행 중에 차단되는 스레드를 항상 하나씩 사용하기 때문입니다. 이러한 상황async-await
에서 내 경우 남은 유일한 이점 은 한 번에 여러 작업을 수행하는 것입니다. 내가 틀렸다면 정정 해주세요.