2013-10-26 1 views
0

많은 API가 비동기 메서드 만 노출하는 방향으로 이동하고 있습니다. 이러한 방법을 즉시 기다려야하는 상황에서 얼마나 많은 성능 저하가 발생합니까? 내가 현재 스레드가 생성 된 스레드에서 완료 될 때까지 기다리는 것으로 가정 할 때 잘못 되었습니까? 또는 CLR이 이러한 시나리오에서 일종의 마법을 수행하고 모두 동일한 스레드에서 실행되도록 만드시겠습니까?즉시 기다리는 비동기 메서드를 호출 할 때 얼마나 많은 성능이 저하됩니까?

+1

대기를 차단하고 있습니까, 즉 'task.Wait()'또는 비동기식 '대기'즉 '대기중인 작업'입니까? – Noseratio

+0

'task.Wait()'. 이 작업을 수행하는 방법은 '비동기'로 만들 수 없기 때문에 '대기'를 호출 할 수 없습니다. –

+0

왜 비동기 메서드를 호출할까요? 전화 할 동기 버전이 없습니까? 다른 일이 어떻게 시작되는지에 따라 비동기 메소드를 시작하는 방법을 알려주십시오. –

답변

3

"비동기 메서드"로, 나는 비동기 메서드를 기반으로 Task<T>을 의미한다고 가정합니다.

Task<T>을 반환하는 메서드가있는 경우 즉시 Wait() 메서드를 호출하면 현재 WaitHandle 개체에서 대기 할 수 있습니다. 이 작업은 다른 스레드에서 실행될 가능성이 높으며 완료 될 때 WaitHandle 신호를 보내 대기 스레드를 해제합니다. 이 시나리오를 내가 알고있는 동기식 호출로 바꾸는 컴파일러 최적화는 없습니다.

물론 이것은 async 메소드와 동등한 동기식 함수를 호출하는 것 이상의 작업입니다. 그러나 유스 케이스에 따라 크게 차이가 없을 것입니다.

더 중요한 질문은 왜 호출 스레드를 차단하여 비동기의 장점을 잃고 싶습니까? 그것은 일반적으로 좋은 생각이 아니므로, 당신은 이것을 할 아주 좋은 이유가 있음을 보장해야합니다.

+0

이것은 작업을 즉시 기다리는 것 외에는 선택의 여지가없는 시나리오입니다. 구체적으로, 나는 'Global.asax'의'Application_PostAuthenticateRequest'에서 이것을하고 있습니다. –

+0

@ w.brian, 내 경험이이 영역에 제한되어 있지만 ASP.NET 4.5 이벤트 처리기에서'RegisterAsyncTask'를 통해'async' 작업을 사용할 수 있다고 생각합니다. [자세한 내용은 http://www.hanselman.com을 참조하십시오. /blog/MagicOfAssingAsynchronousMethodInASPNET45PlusAnImportantGotcha.aspx). – Noseratio

+0

실제로'Task'는 WaitHandle을 사용하지 않고, ManualResetEventSlim을 사용합니다. 그러나 그것은 큰 차이가 아닙니다. – svick

관련 문제