Domanda

Ho un'applicazione scritta in C # che non ha alcun GUI o UI, ma invece scrive i file che vengono analizzati da un'altra applicazione (in XML e altri).

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

Vorrei un modo per impostare il CultureInfo globalmente all'interno dell'applicazione, per tutte le filettature. Ho provato:

  1. Il (apparentemente) l'approccio abituale di impostazione CurrentThread.CurrentCulture come la prima linea di Main () , ma sembra farsi resettare.
  2. Una variazione / espansione sul http://www.codeproject.com/KB/cs /Change_App_Culture.aspx
  3. Fare lo stesso (1 #) sui fili esplicitamente creati nell'applicazione.

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

[Edit] L'applicazione si lega a una presa di corrente e gestisce le richieste da parte dei clienti dedicati. A seconda del tipo di richiesta che genera diverse classi handler.

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

Si scopre che ho perso il filo / gestore che è stato la causa del problema. Quindi, l'applicazione funziona correttamente oggi, ma la domanda rimane su se la cultura può essere impostato su tutte le discussioni.

Se si potesse iterare su tutte le discussioni, si risolverebbe il problema, anche. Quindi:

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

È stato utile?

Soluzione

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

Questo è stato un enorme Gotcha mi sono imbattuto in una delle nostre applicazioni quando si utilizza un BackgroundWorker di caricare un file.

L'approccio che ho usato con successo è quello di impostare il locale sul filo di avvio, e quindi utilizzare una fabbrica di filo per creare discussioni con il "locale applicazione". Per BackgroundWorkers è possibile utilizzare sia una fabbrica o di una classe derivata, come Thread è sigillato, mentre BackgroundWorker non lo è.

Altri suggerimenti

In .NET 4.5 è possibile utilizzare CultureInfo.DefaultThreadCurrentCulture

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

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top