2015-01-29 15 views
6

Ich habe eine MVC-app, wo ich meine Basis Controller OnActionExecuting() Methode überschreiben, um meinen Thread Kultur gesetzt:Asynchronität und Faden Kultur

protected override void OnActionExecuting(ActionExecutingContext filterContext) { 
    var langCode = GetLangCode(); 
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(langCode); 
    Thread.CurrentThread.CurrentCulture = new CultureInfo(langCode); 
} 

Wie ich asynchron mehr zu programmieren, haben damit begonnen, ich bin gespannt, wie Kultur beibehalten, wenn wir den Thread, dessen Kultur wir geändert haben, an den Thread-Pool zurückgeben, und ein neuer Thread wird ausgelöst, wenn die Async-Aufgabe abgeschlossen ist? Irgendwelche Fehler, denen ich bewusst sein sollte?

+0

Wird die nächste Anfrage, die von diesem Thread bearbeitet wird, nicht auch eine 'OnActionExecuting'-Fahrt unternehmen? –

+0

@ LasseV.Karlsen Jede Anfrage sollte 'OnActionExecuting' ausführen, aber kann nicht jede Anfrage von mehreren Threads bedient werden? Wenn ich in meiner Datenzugriffsschicht ein asynchrones Modell für die Kommunikation mit der Datenbank verwende, könnte ich dann nicht zwei separate Threads für den Verlauf der Anfrage erhalten, eine, in der die Kultur geändert wurde, und die andere nicht? –

+1

Das scheint möglich, weiß nicht genug darüber, sorry. Gibt es eine Chance, dass Sie .NET 4.5 verwenden? Wenn ja, schauen Sie sich [CultureInfo.DefaultThreadCurrentCulture] (https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.defaultthreadcurryculture%28v=vs.110%29.aspx) an –

Antwort

3

Ein großer Gotcha das await task.ConfigureAwait(false) Muster könnte verwenden, die wird oft als einfaches (aber falsches) Mittel gegen Deadlocks missbraucht. Auf diese Weise würde die Fortsetzung in einem Pool-Thread ohne Synchronisationskontext stattfinden. In diesem Fall wird CurrentCulture nicht gesendet, da it doesn't get flowed as a part of ExecutionContext. Schlimmer noch, Sie verwenden möglicherweise Task.Run(lambda) (was normalerweise nicht in einer ASP.NET-Anwendung sein sollte). Der Code in lambda hat nicht die korrekte CurrentCulture.

Ansonsten wird AspNetSynchronizationContextCurrentCulture über await Fortsetzungen korrekt fließen, obwohl sie auf verschiedenen Threads passieren.

+1

Lange Zeit no see :) –

+0

@YuvalItzchakov, in der Tat :) Mein Neugeborenes besteht darauf, dass ich mehr mit ihm abhängen sollte als auf SO :) – Noseratio

+0

Congrats !! Definitiv eine Priorität Wechsler;) –