2012-04-04 2 views
15

프리젠 테이션을 진행하면서 올바른 컨텍스트에서 ActionResult가 반환되지 않아서 다음 작업이 실패 할 것이라고 생각했습니다. VS로로드 테스트를했는데 오류가 없습니다. 나는 그것을 디버깅하고 그것이 스레드를 전환하고 있음을 알고 있습니다. 그래서 그것이 합법적 인 코드 인 것 같습니다.ASP.NET MVC 액션에서 ConfigureAwait 호출하기

ASP.NET은 클라이언트 응용 프로그램과 같이 컨텍스트 또는 스레드가 무엇인지 신경 쓰지 않습니까? 그렇다면 AspNetSynchronizationContext는 어떤 목적을 제공합니까? 나는 액션 자체에 ConfigureAwait을 넣는 것이 옳다고 생각하지 않는다. 그것에 대해 뭔가 잘못된 것 같습니다. 아무도 설명 할 수 있을까요?

public async Task<ActionResult> AsyncWithBackendTest() 
    { 
     var result = await BackendCall().ConfigureAwait(false); 
     var server = HttpContext.Server; 
     HttpContext.Cache["hello"] = "world"; 
     return Content(result); 
    } 
+2

정답은 왜이 일을하는 것이 완전히 정상적인 지 또는이 일을 시도 할 때 실패한 예를 보여 주어야 하는지를 말해야합니다.내 직감은 내가해서는 안되지만, 사실을 뒷받침하고 싶습니다. –

답변

6

ASP.NET에는 (아래 UI 프레임 워크로 인해) 많은 클라이언트 응용 프로그램에서 필요로하는 'UI 스레드'가 필요하지 않습니다. 그 상황은 스레드 선호도에 대한 것이 아니라

Stephen Toub mentions this in an MSDN article합니다 (요청에 대한 보안 컨텍스트 다니는 같은 다른 것들) 페이지의 진행 상황을 추적 :

Windows Forms의 유일한 환경 아니다 SynchronizationContext 파생 클래스 인 을 제공합니다. ASP.NET은 공개도 아니지만 외부 사용을 위해 을 의미하지는 않지만 AspNetSynchronizationContext도 제공합니다. 대신, ASP.NET ASP.NET에서 비동기 페이지 기능을 사용하기 위해 ASP.NET 2.0을 사용합니다 (자세한 내용은 msdn.microsoft.com/msdnmag/issues/05/10/WickedCode 참조). 이 구현 은 모든 미해결 비동기 호출이 완료 될 때까지 ASP.NET이 페이지 처리 완료 을 방지하도록 허용합니다..

동기화 컨텍스트에 대한 자세한 내용은 Stephen Cleary's article from last year입니다.

특히 그림 4에서는 WinForms/WPF의 '특정 스레드'동작이 없지만 전체 내용은 훌륭한 읽기입니다.

한 번에 동일한 응용 프로그램에 대한 여러 작업이 완료되면, AspNetSynchronizationContext 그들이 한 번에 하나를 실행할 수 있도록합니다. 모든 스레드에서 실행할 수 있지만 해당 스레드는 원래 페이지의 ID 및 문화권이 입니다.

+0

이벤트 기반 비동기에서는 처리되지 않은 비동기 호출 처리가 적용되지만 작업 기반 비동기에는 적용되지 않는 것으로 보입니다. 작업이 끝날 때까지 처리되지 않은 호출이 없기 때문입니다. 또한 디버깅을 통해 사용자의 양식 ID와 해당 언어 (보안 및 문화권)가 ConfigureAwait 이후에도 손상되지 않았 음을 알 수 있습니다. 그래서 SyncContext에 대한 이유를 읽었지만 아무 것도 깨진 것 같지 않습니다. ConfigureAwait가 여기에 사용되어서는 안된다는 것을 증명하기 위해 무엇을 할 수 있습니까? –

4

코드에서 HttpContextAsyncController 기본 클래스의 구성원입니다. 이것은 실행중인 스레드의 현재 컨텍스트가 아닙니다.

또한 요청이 아직 완료되지 않았으므로 HttpContext도 유효합니다.

지금은 테스트 할 수 없지만 HttpContext 대신 System.Web.HttpContext.Current을 사용하면 실패 할 것으로 예상됩니다.

P. ConfigureAwait에 관계없이 보안은 이고 항상이 전파됩니다. 문화에 대해서는 잘 모르겠지만 늘 전파 되었다면 놀라지 않을 것입니다.

+0

그래, 내 변수는 항상 스택에 싸여 있기 때문에 항상 유효합니다. 그러나 System.Web.HttpContext.Current에도 유효하고 올바른 데이터가 있습니다. –

+0

'BackendCall'이 동 기적으로 반환됩니까? –

+0

Nope. 논리적 인 확인 외에, 나는 그것을 디버깅하고 스레드를 전환하는 것을 보았다. –