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에서 옵션이 아닌지 설명 할 수 있습니까 (실제로 그렇지 않은 경우)? 또한 그러한 접근법이 적용 가능하다면, 우리가 그 순간에 수행 할 수있는 유일한 호출 인 경우 그러한 메소드를 비동기 적으로 호출해야합니다 (완료를 기다리는 동안 수행해야 할 다른 작업이없는 경우).
이 주제의 그물에있는 대부분의 기사는 이미 awaitable
방법을 제공하는 코드를 사용하여 async-await
접근 방식을 사용하는 것을 다루지 만 저의 경우는 아닙니다. Here 내 사건을 설명하는 좋은 기사, 병렬 통화의 상황을 설명하지 않는, 동기화 전화를 감싸는 옵션을 거부하지만 내 생각에 내 상황은 정확하게 그것을 할 기회입니다.
도움과 팁에 대해 미리 감사드립니다.
자세한 답변을 주셔서 감사합니다. 내가 분명히하고 싶은 한 가지 더. 'Task.Run'을 사용하여 실행을 시작하면 내용은 다른 스레드에서 실행됩니다. 스레드 풀에서 가져옵니다. 그렇다면 블로킹 호출 (예 : 서비스 호출)을'Run'으로 랩 할 필요가 없습니다. 왜냐하면 항상 메소드를 실행하는 동안 블로킹 될 하나의 쓰레드를 소비하기 때문입니다. 그러한 상황에서 나의 경우에는 'async-await'에서 남겨진 유일한 이익은 한 번에 여러 가지 작업을 수행하는 것입니다. 내가 틀렸다면 나를 바로 잡아주세요. – Eadel
또한 "서비스"는 원격 웹 서비스에 대한 호출입니다.이 서비스는 우리 서버에 CPU 바인딩되지 않지만 원격 시스템에서 응답을 얻으려면 시간이 필요합니다. 두 번째 가정에 대한 주제에서 대부분의 요청 중에 작업을 수행 할 수있는 옵션을 제공하지만이 경우에는 속도와 서버로드가 모두 중요합니다. 응용 프로그램은 내부 응용 프로그램이 아니므로 최대로드가 많은 요청이 발생할 수 있습니다. – Eadel
네,'Run' (또는'Parallel')에서 얻을 수있는 유일한 이점은 동시성입니다. 작업은 여전히 각각 스레드를 차단합니다.서비스가 웹 서비스라고 말했기 때문에'Run'이나'Parallel'을 사용하지 않는 것이 좋습니다. 대신 서비스 용 비동기 API를 작성하십시오. –