17 Stimmen

Wie kann ich die CurrentCulture des gesamten Prozesses (nicht nur des aktuellen Threads) in .Net ändern?

Ich habe eine Situation, in der ich das Gebietsschema meines Prozesses auf en-US setzen muss.

Ich weiß, wie man das für den aktuellen Thread macht:

System.Threading.Thread.CurrentThread.CurrentCulture = 
     System.Globalization.CultureInfo.CreateSpecificCulture("en-US");

Aber meine Anwendung verwendet BackgroundWorkers zu verarbeiten, und das Gebietsschema für diese Worker-Threads scheint von der obigen Änderung an ihrem spawnenden Haupt-Thread nicht betroffen zu sein.

Wie kann ich also das Gebietsschema für alle Threads in meiner Anwendung festlegen, ohne es in jedem einzelnen Thread manuell einzustellen?

15voto

RichardOD Punkte 28349

Sie müssen das Gebietsschema des Betriebssystems ändern, wenn Sie das tun wollen. Aus welchem Grund wollen Sie, dass BackgroundWorkers in en-US läuft?

Sie sollten Ihre Geschäftsschicht in einer unveränderlichen Kultur laufen lassen und nur eine spezifische Kultur für die Benutzeroberfläche des Endbenutzers haben.

Wenn Sie die BackgroundWorker Komponente haben, und dies tun müssen, könnten Sie in der DoWork-Methode etwas wie das Folgende versuchen:

// In DoWork
System.Globalization.CultureInfo before = System.Threading.Thread.CurrentThread.CurrentCulture;
try

{
    System.Threading.Thread.CurrentThread.CurrentCulture = 
        new System.Globalization.CultureInfo("en-US");
 // Proceed with specific code
}

finally
{
    System.Threading.Thread.CurrentThread.CurrentUICulture = before;
}

12voto

Eric MSFT Punkte 3196

Mit 4.0 müssen Sie dies selbst verwalten, indem Sie die Kultur für jeden Thread festlegen. Aber mit 4.5 können Sie eine Kultur für die App-Domäne definieren, und das ist der bevorzugte Weg, dies zu handhaben. Die relevanten Apis sind CultureInfo.DefaultThreadCurrentCulture y CultureInfo.DefaultThreadCurrentUICulture .

2voto

Ondřej Vykouk Punkte 243

Wir verwenden eine Hilfsklasse für BackgroudWorker wie diese:

public static class BackgroundWorkerHelper
{
public static void RunInBackground(Action doWorkAction, Action completedAction, CultureInfo cultureInfo)
    {
        var worker = new BackgroundWorker();
        worker.DoWork += (_, args) =>
        {
            System.Threading.Thread.CurrentThread.CurrentCulture = cultureInfo;
            System.Threading.Thread.CurrentThread.CurrentUICulture = cultureInfo;
            doWorkAction.Invoke();
        };
        worker.RunWorkerCompleted += (_, args) =>
        {
            System.Threading.Thread.CurrentThread.CurrentCulture = cultureInfo;
            System.Threading.Thread.CurrentThread.CurrentUICulture = cultureInfo;
            completedAction.Invoke();
        };

        worker.RunWorkerAsync();
    }
}

Beispiel für die Verwendung:

BackgroundWorkerHelper.RunInBackground(() => { Work(); }, () => { AfterWork(); },Thread.CurrentThread.CurrentCulture);

1voto

Paolo30Rose Punkte 11

Usa esto:

worker.RunWorkerAsync(Thread.CurrentThread.CurrentCulture.LCID);//Pass the LCID as argument

Nach getaner Arbeit machen Sie das:

Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(int.Parse(e.Argument.ToString()));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X