aktywnego języku określa się na podstawie adresu URL, a następnie ustawić naPrzełęcz CurrentUICulture do Async zadaniem w ASP.NET MVC 3.0
Thread.CurrentThread.CurrentUICulture = cultureInfo;
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name);
ten sposób tłumaczenia są pobierane z odpowiednich plików zasobów.
Podczas korzystania z akcji asynchronicznej na kontrolerach mamy wątek w tle, w którym wątek.CurrentThread.CurrentUICulture jest ustawiony ponownie na domyślny system operacyjny. Ale także w wątku tła potrzebujemy odpowiedniego języka.
stworzyłem TaskFactory rozszerzenie przekazać kulturę do wątku tła i wygląda to tak:
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();
});
}
To pozwala mi wykonać następujące czynności w charakterze kontrolera działania:
[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);
}
ten wszystko działa idealnie, ale mam pewne obawy.
Czy jest to właściwy sposób przedłużenia działania poprzez ustawienie kultury przed wywołaniem pierwotnej akcji?
Czy ktoś wie o inny sposób przekazywać te CurrentUICulture do wątku tła dla akcji Async ASP.NET MVC?
- Sesja nie jest opcją.
- Mam na myśli wykorzystanie CallContext.
Jakieś inne komentarze na temat tego kodu?
Dzięki
Tak właśnie zawsze to robiłem, także w aplikacjach ASP. Zawiń kod "nowego wątku" w coś, co sprawia, że nie można zapomnieć o przekazaniu stanu lokalnego dla wątku, który jest potrzebny dla nowych wątków. – bzlm
Podobne pytanie http://stackoverflow.com/questions/5144314/in-net-best-way-for-keeping-currentculture-on-new-thread –
Niezła metoda! Zastanawiam się tylko: dlaczego "Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture (cultureInfo.Name)", a nie po prostu przypisać to samo 'cultureInfo'? –