5

활성 언어 비동기 작업에 패스 CurrentUICulture이 URL을 결정하고ASP.NET MVC 3.0

Thread.CurrentThread.CurrentUICulture = cultureInfo; 
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name); 

에 번역이 올바른 리소스 파일에서 검색되는 방법을 설정합니다.

컨트롤러에서 비동기 작업을 사용할 때 Thread.CurrentThread.CurrentUICulture가 OS 기본값으로 다시 설정된 백그라운드 스레드가 있습니다. 또한 백그라운드 스레드에서 올바른 언어가 필요합니다.

나는 백그라운드 스레드에 문화를 전달하는 TaskFactory 확장을 생성하며 다음과 같습니다

[HttpPost] 
public void SearchAsync(ViewModel viewModel) 
{ 
    AsyncManager.OutstandingOperations.Increment(); 
    AsyncManager.Parameters["task"] = Task.Factory.StartNew(() => 
    { 
     try 
     { 
       //Do Stuff 
       AsyncManager.Parameters["viewModel"] = viewModel; 
     } 
     catch (Exception e) 
     { 
      ModelState.AddModelError(string.Empty, ResxErrors.TechnicalErrorMessage); 
     } 
     finally 
     { 
      AsyncManager.OutstandingOperations.Decrement(); 
     } 
    }, Thread.CurrentThread.CurrentUICulture); 
} 



public ActionResult SearchCompleted(Task task, ViewModel viewModel) 
{ 
    //Wait for the main parent task to complete. Mainly to catch all exceptions. 
    try { task.Wait(); } 
    catch (AggregateException ae) { throw ae.InnerException; } 

    return View(viewModel); 
} 

이 :이 날은 액션 컨트롤러에서 다음을 수행 할 수 있습니다

public static Task StartNew(this TaskFactory taskFactory, Action action, CultureInfo cultureInfo) 
{ 
    return taskFactory.StartNew(() => 
    { 
     Thread.CurrentThread.CurrentUICulture = cultureInfo; 
     Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name); 

     action.Invoke(); 
    }); 
} 

모든 것이 완벽하게 작동하지만 몇 가지 우려가 있습니다.

원래 작업을 실행하기 전에 문화권을 설정하여 작업을 확장하는 올바른 방법입니까?

ASP.NET MVC 비동기 작업에 대한 백그라운드 스레드에 CurrentUICulture를 전달하는 다른 방법을 알고 계신 분이 있습니까?

  • 세션을 사용할 수 없습니다.
  • 나는 CallContext를 사용하려고 생각하고 있었다.

이 코드에 대한 다른 의견이 있으십니까?

감사

+0

이것은 ASP 응용 프로그램을 포함하여 항상 해왔습니다. "새 스레드"코드를 새로운 스레드에 필요한 스레드 로컬 상태를 전달하는 것을 잊지 못하게하는 코드에 래핑하십시오. – bzlm

+0

비슷한 질문 http://stackoverflow.com/questions/5144314/in-net-best-way-for-keeping-currentculture-on-new-thread –

+0

좋은 방법! 나는 단지'Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture (cultureInfo.Name);'와 왜'cultureInfo' 같은 것을 할당 할까? –

답변

1

질문에서 설명 된 방법은 해답이 보인다.