Asp.net mvc 将CurrentUICulture传递给ASP.NET MVC 3.0中的异步任务

Asp.net mvc 将CurrentUICulture传递给ASP.NET MVC 3.0中的异步任务,asp.net-mvc,asynchronous,task-parallel-library,cultureinfo,Asp.net Mvc,Asynchronous,Task Parallel Library,Cultureinfo,活动语言由url确定,然后在 Thread.CurrentThread.CurrentUICulture = cultureInfo; Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name); 这样就可以从正确的资源文件中检索翻译 在控制器上使用异步操作时,我们有一个后台线程,其中thread.CurrentThread.CurrentUICulture设置回操作系统默认

活动语言由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);
 }
这一切都很完美,但我确实有一些顾虑

这是通过在调用原始操作之前设置区域性来扩展操作的正确方法吗

有人知道将te CurrentUICulture传递给ASP.NET MVC异步操作的后台线程的不同方法吗

  • 会话不是一个选项
  • 我确实在考虑使用CallContext
对该代码有其他评论吗


谢谢

问题中描述的方式似乎就是答案。

我一直都是这样做的,包括在ASP应用程序中。将“新线程”代码包装成这样的东西,这样就不可能忘记传递新线程所需的线程本地状态!我只是想知道:为什么
Thread.CurrentThread.CurrentCulture=CultureInfo.CreateSpecificCulture(CultureInfo.Name)cultureInfo