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

标签 asp.net-mvc asynchronous task-parallel-library cultureinfo

事件语言由 url 确定,然后在上设置

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

这样就可以从正确的资源文件中检索翻译。

在 Controller 上使用异步操作时,我们有一个后台线程,其中 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();
     });
}

这允许我在 Action Controller 中执行以下操作:

 [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 异步操作的后台线程的不同方法吗?

  • session 不是一个选项。
  • 我确实在考虑使用 CallContext。

对此代码还有其他评论吗?

谢谢

最佳答案

看来问题中描述的方式就是答案。

关于asp.net-mvc - 将 CurrentUICulture 传递给 ASP.NET MVC 3.0 中的异步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7511318/

相关文章:

asp.net-mvc - AllowAnonymous 无法与自定义 AuthorizationAttribute 一起使用

c# - 如何在 MVC 路由中启用特殊字符?

c# - Winforms 异步更新 UI 模式 - 需要概括

c# - async void 方法的用例,重新审视

.net - 使用TPL Dataflow创建消息总线

asp.net-mvc - 为什么我的 http 帖子从我的 View 模型返回 null

android - 如何在 Android 中实现 "fire-and-forget"异步调用?

javascript - 等待 redux 状态满足条件

c# - Parallel.For 在大约 1370 次迭代后卡住,不知道为什么

asp.net-mvc - 在 ASP.NET MVC 中将引用数据加载到 View 模型中的可靠方法