2010-09-13 32 views

Trả lời

8

Đây không phải là khả thi. Chủ đề nhận được văn hóa mặc định của họ khi Windows tạo chủ đề, được khởi tạo từ ngôn ngữ mặc định của hệ thống như được định cấu hình trong Bảng điều khiển + Khu vực và Ngôn ngữ. Các hàm API Win32 có liên quan là Get/SetThreadLocale().

Không có cơ chế trong CLR để truyền một chuỗi với mặc định khác. Một kịch bản phổ biến cho một luồng là bắt đầu cuộc sống được tạo ra bởi mã không được quản lý và chạy rất nhiều mã không được quản lý đó, đôi khi thực hiện một cuộc gọi lại vào mã được quản lý. Mã được quản lý đó sẽ chạy với Thread.CurrentCulture được đặt thành văn hóa được chọn bởi mã không được quản lý. Hoặc Windows mặc định nếu mã không được quản lý không gọi SetThreadLocale(). Có sự thay đổi CLR nó sẽ gây ra sự thất bại không thể đoán trước trong mã không được quản lý.

Tất nhiên bạn có thể ghi đè nó một cách rõ ràng nhưng rất khó để có được quyền. Các lỗi định dạng tinh tế rất dễ nhìn thấy, nó sẽ khó khi bạn sử dụng, nói rằng, cấu trúc dữ liệu ngầm hoàn toàn dựa vào các thứ tự sắp xếp của chuỗi. Một SortedList đột nhiên không thể tìm thấy một phần tử trong danh sách thực sự hiện diện. Kiểm soát nó là khó quá, rất nhiều threadback threadback thread nhỏ trong suốt khuôn khổ .NET.

Không gây rối với điều này để tránh rơi vào bẫy như thế này, hoặc dựa vào mặc định của hệ thống hoặc áp dụng CultureInfo một cách rõ ràng.


Cập nhật: như đã lưu ý bởi Thomas, một giải pháp sẽ có sẵn trong .NET 4.5, nó có thuộc tính mới cho lớp CultureInfo để đặt văn bản mặc định của miền ứng dụng. Tài liệu MSDN are here. Sự tương tác chính xác với các luồng không được quản lý nhập mã được quản lý không phải là rất rõ ràng từ tài liệu, hãy chắc chắn kiểm tra điều này nếu bạn đã bao giờ cho phép mã gốc tạo callbacks, chẳng hạn như thông qua pinvoke, Marshal.GetFunctionPointerForDelegate() hoặc sự kiện của đối tượng COM.


UPDATE2: văn bản này được thay đổi một lần nữa trong .NET 4.6, văn bản hiện đang chuyển từ chuỗi này sang chuỗi khác để chế độ thất bại nhanh nhất được xử lý. Đọc chi tiết về nó trong bài viết MSDN cho CultureInfo.CurrentCulture. Bạn phải nhắm mục tiêu rõ ràng 4.6 để nhận được lợi ích.

+1

Theo [trang này] (http://msdn.microsoft.com/en-us/library/ms171868%28v=vs.110%29.aspx), nó sẽ có thể trong .NET 4.5: "Khả năng xác định văn hóa cho một miền ứng dụng". Tuy nhiên tôi không tìm thấy làm thế nào để làm điều đó ... Tôi không thể nhìn thấy bất kỳ tài sản có liên quan trong AppDomain hoặc AppDomainSetup –

+0

@Thomas: xem Valdis '[answer] (http://stackoverflow.com/a/8030336/107604) phía dưới. –

3

Bạn có thể có một phương pháp tùy chỉnh mà sẽ cháy chủ đề và thiết lập nền văn hóa tự động:

static bool StartThread(WaitCallback callback, object state) 
{ 
    return ThreadPool.QueueUserWorkItem(s => 
    { 
     // Set the culture 
     Thread.CurrentThread.CurrentCulture = new CultureInfo("es-ES"); 
     // invoke the callback 
     callback(s); 
    }, state); 
} 

Và khi bạn cần để bắt đầu một chủ đề mới chỉ cần sử dụng phương pháp này:

StartThread(state => { /** Do some processing on a new thread **/ }, null); 
+0

đẹp giải pháp ... nhưng nó bỏ lỡ mục tiêu - Tôi cần cái gì đó sẽ thiết lập văn hóa ngay cả khi tôi quên đặt nó. Điều tương tự cũng có thể xảy ra ở đây nếu tôi quên bắt đầu luồng thông qua phương thức 'StartThread'. Tôi muốn tất cả các chủ đề kế thừa văn hóa của họ tự động – Nissim

+0

Chính xác. Bạn có thể chỉ cho tôi đoạn trích để thực hiện việc này không? – Nissim

Các vấn đề liên quan