2017-12-19 13 views
2

안녕하세요 내 컨트롤러에이 코드가 있습니다비동기/기다리고 있습니다 작동하지 않습니다

[HttpGet] 
[Route("/Test")] 
public async Task<IActionResult> Test() { 
    Console.WriteLine("foo"); 
    await Task.Delay(2000); 
    Console.WriteLine("bar"); 
    return Ok(); 
} 

를 그리고 자바 스크립트로 테스트하려고 : 내가 기대

for(let i=0; i<2; i++){ 
    axios.get('/Test').then(response => { 
     console.log(`task ${i} finish`) 
    }) 
} 

서버에 출력해야한다 : 내가 가진 그러나 무엇

foo 
foo 
foo 
bar 
bar 
bar 

은 다음과 같습니다

foo 
bar 
foo 
bar 
foo 
bar 

내가 혼동스럽지 않고 await Task.Delay(2000)은 제어 흐름을 프로세스로 되돌리고 다른 요청을 처리 할 수 ​​있습니까? 액션 메서드는 많은 수의 요청을 동시에 처리 할 수 ​​없다고 생각됩니다. 비동기/기다림에 대해 내가 오해하고 있습니까? 비 차단 긴 웹 서비스 호출을 시뮬레이션하려면 어떻게해야합니까?

정말 코드의 모습에서 이전하지만 Axios의와 함께 일한 적이

I read this post but still can't figure out what is the solution

답변

1

대부분의 ASP.NET은 동일한 클라이언트의 요청을 순서대로 처리합니다. 첫 번째 작업이 진행되는 동안 두 번째 요청 처리를 시작하지 않습니다. 전체 프레임 워크에서 오래된 ASP.NET MVC는 사실이었고 세션 상태에 대한 동시 액세스를 피하기 위해 그렇게되었습니다. SessionState(SessionStateBehaviour.Disabled) 특성을 적용하여이 동작을 변경할 수있었습니다. 이 질문을 확인하십시오 ASP.NET MVC and Ajax, concurrent requests?. ASP.NET 코어에도 비슷한 내용이 적용될 수 있습니다.

나는 비동기/대기에 대해 오해하고 있습니까? 비 차단 긴 웹 서비스 호출을 시뮬레이션하려면 어떻게해야합니까?

요청 처리가 차단되지 않습니다. 그것들은 단순히 연속적입니다. 다른 클라이언트 (브라우저)에서 동일한 작업에 액세스하려고하면 해당 작업이 병렬로 실행된다는 것을 알 수 있습니다.

+1

감사합니다. ASP.NET 코어 측면에서 몇 가지 중복 된 메서드를 만들고 다른 브라우저에서 여러 요청을 실행 한 후에는 동시에 반환하기 시작했습니다. ASP.NET 코어가 다른 탭의 요청을 동일한 소스로 처리하고 액션 메서드를 하나씩 실행한다는 것은 다소 이상합니다. 예상 된 결과를보기 위해 2 가지 다른 브라우저를 사용해야합니다. –

0

, 당신의 ASP.NET의 코드는 자바 스크립트의 문제가 아닙니다.

ASP.NET은 async/await을 매우 잘 처리하며 예제에서는 올바르게 작동합니다. 문제는 귀하의 자바 스크립트가 한 번에 한 요청을하고, 결과를 기다리는 것처럼 보이고 (2 초 걸림) for 루프를 계속한다는 것입니다.

for(let i=0; i<2; i++){ 
    // this starts a request to /Test and waits the result 
    // since your controller waits 2 seconds before returning OK 
    // it looks like its sync 
    axios.get('/Test').then(response => { 
     console.log(`task ${i} finish`) 
    }) 
} 

테스트를 수행 할 콜백 기반 기능이 없습니까?

+0

나는'axios.get()'이 Promise를 즉시 반환하고 for-loop를 계속 실행하면 결과적으로 동기식/순차 방식 대신 거의 모든 시간에 3 개의 호출이 모두 반환된다고 가정합니다. –

+1

@OptimusFrog 브라우저의 개발자 도구에서 어떤 요청이 서버로 전송되는지 확인할 수 있습니다. 문제가 클라이언트 또는 서버 측에 있는지 확실히 알 수 있습니다. –