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를 사용하려고 생각하고 있었다.
이 코드에 대한 다른 의견이 있으십니까?
감사
이것은 ASP 응용 프로그램을 포함하여 항상 해왔습니다. "새 스레드"코드를 새로운 스레드에 필요한 스레드 로컬 상태를 전달하는 것을 잊지 못하게하는 코드에 래핑하십시오. – bzlm
비슷한 질문 http://stackoverflow.com/questions/5144314/in-net-best-way-for-keeping-currentculture-on-new-thread –
좋은 방법! 나는 단지'Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture (cultureInfo.Name);'와 왜'cultureInfo' 같은 것을 할당 할까? –