2010-02-10 7 views
21

Ho un'applicazione scritta in C# che non ha GUI o UI, ma scrive invece file analizzati da un'altra applicazione (in XML e altri).È possibile impostare CultureInfo per un'applicazione .NET o solo un thread?

Ho un cliente il cui CultureInfo ha il NumberDecimalSeparator impostato su una virgola, il che causa errori di parsing con numeri in virgola mobile (PI finirebbe come 3,1415).

Mi piacerebbe un modo per impostare CultureInfo a livello globale all'interno dell'applicazione, per tutti i thread. Ho provato:

  1. L'(apparentemente) l'approccio consueto della creazione CurrentThread.CurrentCulture come prima linea nel Main() ma sembra farsi resettare.
  2. Una variazione/espansione su http://www.codeproject.com/KB/cs/Change_App_Culture.aspx
  3. Eseguire lo stesso (# 1) sui thread creati in modo esplicito nell'applicazione.

E la modifica per utilizzare la formattazione esplicita non è un'opzione (linee 150K +, la maggior parte scritte da ex dipendenti).

[Modifica] L'applicazione si collega a un socket e gestisce le richieste da client dedicati. A seconda del tipo di richiesta, genera diverse classi di gestori.

Siamo spiacenti, quando ho postato avrei chiarito a # 1, che (io però) che avevo fatto questo in tutti i gestori che sono stati esplicitamente hanno generati, anche.

Si scopre che ho perso il thread/gestore che stava causando il problema. Ora l'applicazione funziona correttamente, ma la domanda rimane se la cultura può essere impostata su tutti i thread.

Se potesse scorrere su tutti i thread, risolverebbe anche il problema. Quindi:

Come posso ottenere tutte le discussione oggetti (non ProcessThread) nel processo in corso?

risposta

13

Purtroppo, ogni nuovo thread inizia con il sistema informativo locale , anche se è iniziato da un thread che ha avuto il suo locale cambiato in qualcos'altro.

Questo è stato un grande trucco che ho incontrato in una delle nostre app quando si utilizza un BackgroundWorker per caricare un file.

L'approccio che ho usato con successo è quello di impostare le impostazioni internazionali sul thread di avvio e quindi utilizzare una produzione di thread per creare thread con "l'applicazione locale dell'applicazione". Per BackgroundWorkers è possibile utilizzare una classe di produzione o una classe derivata, poiché Thread è sigillato mentre non lo è il numero BackgroundWorker.

+6

aiuta solo se si è in controllo della creazione thread. A volte devi gestire i thread creati da .NET. Non si dovrebbe mai dimenticare la linea santa ** 'System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo (" EN-US ");' ** – Bitterblue

6

Non credo che è possibile impostare la cultura per l'intera applicazione, ma è possibile impostare l'explicilty cultura ogni volta che si crea un filo:

using System; 
using System.Globalization; 
using System.Threading; 

class Program { 

    static void thread_test() { 
     Console.WriteLine("Culture: {0}", CultureInfo.CurrentCulture.DisplayName); 
    } 

    public static void Main(params string[] args) { 
     Thread t = new Thread(thread_test); 
     t.CurrentCulture = new CultureInfo("it-it"); 
     t.Start(); 
     t.Join(); 
    } 
} 
3

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

26

In .NET 4.5 è possibile utilizzare CultureInfo.DefaultThreadCurrentCulture

Problemi correlati