5
主動語言從URL確定,然後在通行證的CurrentUICulture以異步任務在ASP.NET MVC 3.0
Thread.CurrentThread.CurrentUICulture = cultureInfo;
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name);
設置的翻譯是從正確的資源文件中檢索的方式。
在控制器上使用異步操作時,我們有一個後臺線程,其中Thread.CurrentThread.CurrentUICulture被設置回OS默認值。而且在後臺線程上,我們需要正確的語言。
我創建了一個TaskFactory擴展到文化傳遞給後臺線程,它看起來像這樣:
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();
});
}
這讓我做一個動作控制器如下:
[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);
}
這一切都很完美,但我確實有一些擔憂。
這是在調用原始動作之前通過設置文化來擴展動作的正確方法嗎?
有誰知道一種不同的方式來將CurrentUICulture傳遞給ASP.NET MVC異步操作的後臺線程嗎?
- 會話不是一個選項。
- 我在考慮使用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'? –