문제

GUI나 UI가 없는 C#으로 작성된 응용 프로그램이 있지만 대신 다른 응용 프로그램(XML 등)에서 구문 분석되는 파일을 작성합니다.

CultureInfo의 NumberDecimalSeparator가 쉼표로 설정된 고객이 있습니다. 이로 인해 부동 소수점 숫자 구문 분석 오류가 발생합니다(PI는 다음과 같이 끝납니다). 3,1415).

모든 스레드에 대해 응용 프로그램 내에서 전역적으로 CultureInfo를 설정하는 방법을 원합니다.난 노력 했어:

  1. (분명히) 관례적인 설정 접근 방식 현재스레드.현재문화 첫 번째 줄로 기본() 하지만 재설정되는 것 같습니다.
  2. 변형/확장 http://www.codeproject.com/KB/cs/Change_App_Culture.aspx
  3. 애플리케이션에서 명시적으로 생성된 스레드에 대해 동일한 작업(#1)을 수행합니다.

그리고 명시적 서식을 사용하도록 변경하는 것은 옵션이 아닙니다(150,000줄 이상, 대부분 전직 직원이 작성).

[편집하다]애플리케이션은 소켓에 바인딩되어 전용 클라이언트의 요청을 처리합니다.요청 유형에 따라 다양한 핸들러 클래스가 생성됩니다.

죄송합니다. 처음 게시했을 때 #1에서 다음 사항을 명확히 했어야 했습니다(나는 그래도) 명시적으로 생성된 모든 핸들러에서도 이 작업을 수행했습니다.

문제를 일으키는 스레드/핸들러를 놓친 것으로 나타났습니다. 따라서 애플리케이션은 이제 제대로 작동하지만 모든 스레드에 문화권을 설정할 수 있는지에 대한 의문이 남아 있습니다.

모든 스레드를 반복할 수 있다면 문제도 해결될 것입니다.그래서:

어떻게 다 얻을 수 있나요? 객체(아님 프로세스스레드) 현재 과정에서는?

도움이 되었습니까?

해결책

안타깝게도 모든 새 스레드는 시스템 로케일 정보로 시작됩니다. 로케일이 다른 것으로 변경된 스레드에서 시작된 경우에도 마찬가지입니다.

이것은 제가 우리 앱 중 하나를 사용할 때 겪었던 큰 문제였습니다. BackgroundWorker 파일을 로드합니다.

내가 성공적으로 사용한 접근 방식은 스타트 업 스레드에서 로케일을 설정 한 다음 스레드 공장을 사용하여 "응용 프로그램 로케일"과 함께 스레드를 만드는 것입니다. 배경 노동자의 경우 공장이나 파생 클래스를 사용할 수 있습니다. Thread 밀봉되어 있는 동안 BackgroundWorker 아니다.

다른 팁

.NET 4.5에서는 CultureInfo.DefaultThreadCurrentCulture를 사용할 수 있습니다.

전체 애플리케이션에 대해 문화권을 설정할 수는 없지만 스레드를 만들 때마다 문화권 명시성을 설정할 수는 있습니다.

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");

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top