5

aktywnego języku określa się na podstawie adresu URL, a następnie ustawić naPrzełęcz CurrentUICulture do Async zadaniem w ASP.NET MVC 3.0

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

ten sposób tłumaczenia są pobierane z odpowiednich plików zasobów.

Podczas korzystania z akcji asynchronicznej na kontrolerach mamy wątek w tle, w którym wątek.CurrentThread.CurrentUICulture jest ustawiony ponownie na domyślny system operacyjny. Ale także w wątku tła potrzebujemy odpowiedniego języka.

stworzyłem TaskFactory rozszerzenie przekazać kulturę do wątku tła i wygląda to tak:

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(); 
    }); 
} 

To pozwala mi wykonać następujące czynności w charakterze kontrolera działania:

[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); 
} 

ten wszystko działa idealnie, ale mam pewne obawy.

Czy jest to właściwy sposób przedłużenia działania poprzez ustawienie kultury przed wywołaniem pierwotnej akcji?

Czy ktoś wie o inny sposób przekazywać te CurrentUICulture do wątku tła dla akcji Async ASP.NET MVC?

  • Sesja nie jest opcją.
  • Mam na myśli wykorzystanie CallContext.

Jakieś inne komentarze na temat tego kodu?

Dzięki

+0

Tak właśnie zawsze to robiłem, także w aplikacjach ASP. Zawiń kod "nowego wątku" w coś, co sprawia, że ​​nie można zapomnieć o przekazaniu stanu lokalnego dla wątku, który jest potrzebny dla nowych wątków. – bzlm

+0

Podobne pytanie http://stackoverflow.com/questions/5144314/in-net-best-way-for-keeping-currentculture-on-new-thread –

+0

Niezła metoda! Zastanawiam się tylko: dlaczego "Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture (cultureInfo.Name)", a nie po prostu przypisać to samo 'cultureInfo'? –

Odpowiedz

1

Wydaje się, że opisany sposób w pytaniu jest odpowiedź.