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

Posted

技术标签:

【中文标题】将 CurrentUICulture 传递给 ASP.NET MVC 3.0 中的异步任务【英文标题】:Pass CurrentUICulture to Async Task in ASP.NET MVC 3.0 【发布时间】:2011-09-22 07:46:02 【问题描述】:

活动语言由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。

此代码上还有其他 cmet 吗?

谢谢

【问题讨论】:

这就是我一直这样做的方式,包括在 ASP 应用程序中。将“新线程”代码包装在一些东西中,这样就不会忘记传递新线程所需的线程本地状态。 类似问题***.com/questions/5144314/… 好方法!我只是想知道:为什么Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name); 而不仅仅是简单地分配相同的cultureInfo 【参考方案1】:

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

【讨论】:

以上是关于将 CurrentUICulture 传递给 ASP.NET MVC 3.0 中的异步任务的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AS3 中正确将 URL 传递给 UrlRequest?

将 std::forward_as_tuple() 结果传递给可能从该对象的右值引用成员移动的多个函数?

XSLT:如何将节点值传递给自定义 xsl:function ?

传递给新变量对象的 JavaScript 变量 POSTing as undefined to another page

JS如何传递ByteArray类型 给as3?

Laravel 路由将变量传递给控制器