2015-01-29 2 views
6

나는 내 스레드 문화를 설정하는 내 기본 컨트롤러의 OnActionExecuting() 메소드를 오버라이드 (override) MVC 응용 프로그램을 문화권을 수정 한 스레드를 스레드 풀로 반환하면 비동기 작업이 완료 될 때 새 스레드가 전달됩니다. 내가 알아야 할 문제가 있니?비동기 및 스레드 문화

+0

그 스레드가 처리중인 다음 요청은'OnActionExecuting'을 통해 이동하지 않습니까? –

+0

@ LasseV.Karlsen 각 요청은'OnActionExecuting'을 실행해야하지만, 각 요청은 다중 스레드에 의해 서비스 될 수 없습니까? 내 데이터 액세스 계층에서 비동기 모델을 사용하여 데이터베이스와 통신하는 경우 요청 과정에서 두 개의 개별 스레드 (문화권이 수정 된 위치, 그렇지 않은 위치)를 얻을 수 있습니까? –

+1

그건 가능해, 이것에 대해 충분히 알지 못해, 미안. NET 4.5를 사용하고 계신가요? 그렇다면 [CultureInfo.DefaultThreadCurrentCulture] (https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.defaultthreadcurrentculture%28v=vs.110%29.aspx)를보십시오 –

답변

3

주요 잡았다는 await task.ConfigureAwait(false) 패턴을 사용하여 될 수는있는 교착 상태에 대한 쉬운 (그러나 잘못된) 구제 수단으로 종종 오용됩니다. 이 방법은 동기화 컨텍스트없이 풀 스레드에서 계속됩니다. 이 경우 it doesn't get flowed as a part of ExecutionContext이므로 CurrentCulture이 전송되지 않습니다. 더 나쁜 것은 Task.Run(lambda) (일반적으로 ASP.NET 응용 프로그램에 있어서는 안 됨)을 사용하는 것입니다. lambda 안에있는 코드는 올바른 CurrentCulture이 아닙니다.

그렇지 않으면 AspNetSynchronizationContext은 다른 스레드에서 발생하더라도 await 연속으로 정확히 CurrentCulture을 전달합니다.

+1

오랜 시간 아니 참조 :) –

+0

@ YuvalItzchakov, 참으로 :) 내 신생아 하나 내가 그와 함께보다 더 놀아 야한다고 주장 : – Noseratio

+0

축하해! 확실히 우선 순위 변경자;) –