6

Я использую автоматическую глобализацию на веб-сайте ASP MVC. Он отлично работает, пока он не достиг параллельного блока:Как правильно наследовать культуру потоков в параллельном блоке?

public ActionResult Index() 
{ 
    // Thread.CurrentThread.CurrentCulture is automatically set to "fr-FR" 
    // according to the requested "Accept-Language" header 

    Parallel.Foreach(ids, id => { 
     // Not every thread in this block has the correct culture. 
     // Some of them still have the default culture "en-GB" 
    }) ; 

    return View() 
} 

Каков наилучший способ сделать параллельный блок наследует культуру? помимо этого решения:

public ActionResult Index() 
{ 
    var currentCulture = Thread.CurrentThread.CurrentCulture ; 

    Parallel.Foreach(ids, id => { 
     // I don't know if it's threadsafe or not. 
     Thread.CurrentThread.CurrentCulture = currentCulture ; 

    }) ; 

    return View() 
} 
+0

Возможно, один из них имеет культуру запроса из-за задача вложения. Остальные должны следить за поведением пула потоков, что бы это ни было (я так и не узнал). – usr

ответ

3

Вы можете создать свой собственный Parallel.ForEach обработки нити культуры:

public static class ParallelInheritCulture 
{ 
    public static ParallelLoopResult ForEach<T>(IEnumerable<T> source, Action<T> body) 
    { 
     var parentThreadCulture = Thread.CurrentThread.CurrentCulture; 
     var parentThreadUICulture = Thread.CurrentThread.CurrentUICulture; 

     return Parallel.ForEach(source, e => 
     { 
      var currentCulture = Thread.CurrentThread.CurrentCulture; 
      var currentUICulture = Thread.CurrentThread.CurrentUICulture; 

      try 
      { 
       Thread.CurrentThread.CurrentCulture = parentThreadCulture; 
       Thread.CurrentThread.CurrentUICulture = parentThreadUICulture; 

       body(e); 
      } 
      finally 
      { 
       Thread.CurrentThread.CurrentCulture = currentCulture; 
       Thread.CurrentThread.CurrentUICulture = currentUICulture; 
      } 
     }); 
    } 
} 

Тогда:

ParallelInheritCulture.Foreach(ids, id => { 
    // Whatever 

}) ; 
+0

Что нужно, чтобы вернуть культуру внутри параллели.? – Vipresh

Смежные вопросы