Передайте CurrentUICulture асинхронной задаче в ASP.NET MVC 3.0 - PullRequest
5 голосов
/ 22 сентября 2011

Активный язык определяется по URL и затем устанавливается на

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

. Таким образом, переводы извлекаются из правильных файлов ресурсов.

При использовании асинхронного действия на контроллерах,у нас есть фоновый поток, в котором для Thread.CurrentThread.CurrentUICulture установлено значение по умолчанию для ОС.Но также в фоновом потоке нам нужен правильный язык.

Я создал расширение 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.

Любые другие комментарии к этому коду?

Спасибо

1 Ответ

1 голос
/ 30 января 2012

Кажется, описанный способ в вопросе является ответом.

...