2010-09-13 16 views
6

मैं एक विंडोज सेवा बना रहा हूं जो एकाधिक धागे चलाता है। क्या मैं अपने पूरे ऐपडोमेन की संस्कृति को अलग-अलग थ्रेड पर सेट करने के बजाय सेट कर सकता हूं?पूरे एपडोमेन के लिए संस्कृति परिभाषित करें

उत्तर

8

यह नहीं है मुमकिन। थ्रेड को अपनी डिफ़ॉल्ट संस्कृति मिलती है जब विंडोज थ्रेड बनाता है, सिस्टम डिफॉल्ट लोकेल से प्रारंभ होता है जैसा कि नियंत्रण कक्ष + क्षेत्र और भाषा में कॉन्फ़िगर किया गया है। प्रासंगिक Win32 API फ़ंक्शन Get/SetThreadLocale() हैं।

सीएलआर में किसी अन्य डिफ़ॉल्ट के साथ थ्रेड को imbue करने के लिए कोई तंत्र नहीं है। थ्रेड के लिए एक सामान्य परिदृश्य अप्रबंधित कोड द्वारा बनाए गए जीवन को शुरू करना है और उस अप्रबंधित कोड को चलाने के लिए, कभी-कभी प्रबंधित कोड में कॉलबैक करना होता है। वह प्रबंधित कोड Thread.CurrentCulture के साथ चलाया जाएगा अप्रबंधित कोड द्वारा चुने गए संस्कृति में सेट। या Windows डिफ़ॉल्ट अगर अप्रबंधित कोड SetThreadLocale() को कॉल नहीं करता है। सीएलआर परिवर्तन होने से यह अप्रबंधित कोड में अवांछित विफलता का कारण बन जाएगा।

बेशक आप इसे स्पष्ट रूप से ओवरराइड कर सकते हैं लेकिन सही होना मुश्किल है। सूक्ष्म स्वरूपण त्रुटियां देखने के लिए काफी आसान हैं, जब आप स्ट्रिंग के कोटिंग ऑर्डर पर भरोसा करते हैं, तो डेटा संरचनाओं का उपयोग करते समय यह मुश्किल हो जाता है। एक सॉर्टेडलिस्ट अचानक उस सूची में तत्व को वापस नहीं ढूंढ सकता जो वास्तव में मौजूद है। इसे नियंत्रित करना भी मुश्किल है, .NET ढांचे के दौरान बहुत सारे थ्रेडपूल थ्रेड कॉलबैक।

इस तरह के जाल में गिरने से बचने के लिए इसके साथ गड़बड़ न करें, या तो सिस्टम डिफ़ॉल्ट पर भरोसा करें या स्पष्ट रूप से CultureInfo लागू करें।


अद्यतन: के रूप में थॉमस द्वारा बताया गया है, एक समाधान .NET 4.5 में उपलब्ध हो जाएगा, यह appdomain के डिफ़ॉल्ट संस्कृति स्थापित करने के लिए CultureInfo वर्ग के लिए एक नया संपत्ति है। एमएसडीएन दस्तावेज़ are here। प्रबंधित कोड दर्ज करने वाले अप्रबंधित धागे के साथ सटीक बातचीत दस्तावेज़ से बहुत स्पष्ट नहीं है, अगर आप कभी देशी कोड को कॉलबैक बनाने की अनुमति देते हैं, जैसे कि पिनवोक, मार्शल.गेटफंक्शनशनइंटरफॉरडिलेगेट() या COM ऑब्जेक्ट की घटना के माध्यम से।


UPDATE2: इस .NET 4.6 में फिर से बदल कर, संस्कृति अब एक धागे से एक और तो nastiest विफलता मोड का ध्यान रखा जाता करने के लिए बहती है। CultureInfo.CurrentCulture के लिए एमएसडीएन आलेख में इसके बारे में विवरण पढ़ें। लाभ प्राप्त करने के लिए आपको 4.6 को स्पष्ट रूप से लक्षित करना होगा।

+1

[इस पृष्ठ] के अनुसार (http://msdn.microsoft.com/en-us/library/ms171868%28v=vs.110%29।एएसपीएक्स), यह .NET 4.5 में संभव होगा: "अनुप्रयोग डोमेन के लिए संस्कृति को परिभाषित करने की क्षमता"। हालांकि मुझे यह नहीं पता था कि इसे कैसे किया जाए ... मैं ऐपडोमेन या ऐपडोमेनसेटअप –

+0

@ थॉमस में कोई प्रासंगिक प्रॉपर्टी नहीं देख सकता: वाल्डीस [उत्तर] देखें (http://stackoverflow.com/a/8030336/107604) नीचे। –

3

आपको लगता है कि धागे और स्वचालित रूप से संस्कृति की स्थापना की सक्रिय कर देगा एक कस्टम विधि हो सकता है:

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

और जब आप एक नया धागा शुरू करने की आवश्यकता बस इस विधि का उपयोग:

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

अच्छा समाधान ... लेकिन यह लक्ष्य से चूक - मैं कुछ सेट हो जाएगा कि जरूरत संस्कृति जब भी मैं इसे सेट करना भूल जाता हूं। अगर मैं 'स्टार्ट थ्रेड' विधि के माध्यम से थ्रेड शुरू करना भूल जाता हूं तो वही हो सकता है। मैं चाहता हूं कि सभी थ्रेड अपने संस्कृति को स्वचालित रूप से – Nissim

+0

प्राप्त करें। क्या आप मुझे ऐसा करने के लिए स्निपेट दिखा सकते हैं? – Nissim

16

4.5 डिफ़ॉल्ट एप्लिकेशन डोमेन संस्कृतियों के लिए CultureInfo वर्ग के माध्यम से सेट किया जा सकता है:

+1

यह नया सही उत्तर है। – Gleno

संबंधित मुद्दे