차이점은 무엇입니까?
public ActionResult Login(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid)
{
IdentityResult result = IdentityManager.Authentication.CheckPasswordAndSignIn(AuthenticationManager, model.UserName, model.Password, model.RememberMe);
if (result.Success)
{
return Redirect("~/home");
}
else
{
AddErrors(result);
}
}
return View(model);
}
과:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid)
{
IdentityResult result = await IdentityManager.Authentication.CheckPasswordAndSignInAsync(AuthenticationManager, model.UserName, model.Password, model.RememberMe);
if (result.Success)
{
return Redirect("~/home");
}
else
{
AddErrors(result);
}
}
return View(model);
}
이제 MVC 코드에 비동기가 있지만 차이점은 무엇입니까? 하나가 다른 것보다 훨씬 더 나은 성능을 제공합니까? 다른 것보다 문제를 디버깅하는 것이 더 쉽습니까? 내 응용 프로그램에서 Async를 추가하려면 다른 컨트롤러를 변경해야합니까?
답변
비동기 작업은 원격 서버 호출과 같은 I / O 바인딩 작업을 수행 할 때만 유용합니다. 비동기 호출의 이점은 I / O 작업 중에 ASP.NET 작업자 스레드가 사용되지 않는다는 것입니다. 첫 번째 예제의 작동 방식은 다음과 같습니다.
- 요청이 작업에 도달하면 ASP.NET은 스레드 풀에서 스레드를 가져와 실행을 시작합니다.
IdentityManager.Authentication.CheckPasswordAndSignIn
메서드가 호출됩니다. 이것은 차단 호출-> 전체 호출 중에 작업자 스레드가 위험에 처해 있습니다.
두 번째 호출이 작동하는 방식은 다음과 같습니다.
- 요청이 작업에 도달하면 ASP.NET은 스레드 풀에서 스레드를 가져와 실행을 시작합니다.
IdentityManager.Authentication.CheckPasswordAndSignInAsync
즉시 반환 되는 이 호출됩니다. I / O 완료 포트가 등록되고 ASP.NET 작업자 스레드가 스레드 풀로 해제됩니다.- 나중에 작업이 완료되면 I / O 완료 포트가 신호를 받고 스레드 풀에서 다른 스레드를 가져와 뷰 반환을 완료합니다.
두 번째 경우에서 볼 수 있듯이 ASP.NET 작업자 스레드는 짧은 시간 동안 만 사용됩니다. 이는 다른 요청을 처리하기 위해 풀에 더 많은 스레드를 사용할 수 있음을 의미합니다.
결론적으로, 내부에 진정한 비동기 API가있는 경우에만 비동기 작업을 사용하십시오. 비동기 작업 내에서 차단 호출을 수행하면 모든 이점이 없어집니다.
답변
일반적으로 단일 HTTP 요청은 단일 스레드에서 처리되며 응답이 반환 될 때까지 풀에서 해당 스레드를 완전히 제거합니다. TPL을 사용하면이 제약에 구속되지 않습니다. 들어오는 모든 요청은 풀의 모든 스레드에서 실행할 수있는 응답을 계산하는 데 필요한 각 계산 단위로 연속을 시작합니다. 이 모델을 사용하면 표준 ASP.Net보다 더 많은 동시 요청을 처리 할 수 있습니다.
생성 될 새로운 작업인지 여부, 대기해야하는지 여부. 항상 약 70ms에 대해 생각하십시오. 최대. 모든 메소드 호출에 걸리는 시간. 그 길이가 길면 UI가 응답 성을 느끼지 못할 것입니다.
답변
시작시 많은 수의 동시 요청을 보거나 버스트로드 (동시성이 갑자기 증가하는 경우)가있는 웹 애플리케이션에서 이러한 웹 서비스 호출을 비동기식으로 만들면 애플리케이션의 응답 성이 증가합니다. 비동기 요청은 동기 요청과 처리하는 데 동일한 시간이 걸립니다. 예를 들어 요청이 완료하는 데 2 초가 필요한 웹 서비스 호출을 수행하는 경우 요청이 동기식으로 수행 되든 비동기 적으로 수행 되든 2 초가 걸립니다. 그러나 비동기 호출 중에 스레드는 첫 번째 요청이 완료되기를 기다리는 동안 다른 요청에 대한 응답이 차단되지 않습니다. 따라서 비동기 요청은 장기 실행 작업을 호출하는 동시 요청이 많을 때 요청 대기열 및 스레드 풀 증가를 방지합니다.