c# - Are static delegates thread-safe? -
इस कोड स्निपेट पर विचार करें:
सार्वजनिक स्थैतिक वर्ग ApplicationContext {निजी स्थिर फ़ंक्शन & lt; TService & gt; अनिर्धारित और & lt; TService & gt; () {नए अमान्यऑपरेशन अपवाद (); } सार्वजनिक स्थिर Func & lt; IAuthenticationProvider & gt; प्रमाणीकरणप्रदाता = अपरिवर्तित & lt; IAuthenticationProvider & gt; (); सार्वजनिक स्थिर Func & lt; IUnitOfWorkFactory & gt; UnitOfWorkFactory = आरंभिक & lt; IUnitOfWorkFactory & gt; (); } // global.asax में भी हो सकता है अगर वेब ऐप में उपयोग किया जाता है सार्वजनिक स्थिर शून्य मुख्य (स्ट्रिंग [] आर्ग्स) {ApplicationContext.AuthenticationProvider = () = & gt; नया LdapAuthenticationProvider (); ApplicationContext.UnitOfWorkFactory = () = & gt; नया EFUnitOfWorkFactory (); } // कहीं कोड में .. एक asp.net MVC नियंत्रक ApplicationContext.AuthenticationProvider ()। साइन इन (उपयोगकर्ता नाम, सच);
स्थैतिक वर्ग ApplicationContext धागे-सुरक्षित में प्रतिनिधियों को उस सूत्र में कहें, जो बहु-धागे उन्हें आमंत्रित कर सकते हैं?
अगर मैं इस दृष्टिकोण का पीछा करता हूं ?
स्थैतिक वर्ग ApplicationContext में प्रतिनिधियों को इस अर्थ में धागा-सुरक्षित है कि बहु-थ्रेड्स उनसे आह्वान कर सकता है?
हां लेकिन एक प्रतिनिधि केवल धागा-सुरक्षित के रूप में विधि के रूप में दर्शाता है।
अतः, यदि आपके प्रमाणीकरण प्रदिवायर
और UnitOfWorkFactory
प्रतिनिधियों द्वारा बुलाए गए विधियां हैं धागा-सुरक्षित, तो आपके प्रतिनिधि भी होंगे।
आपके द्वारा प्रदान किए गए कोड में, ये केवल कन्स्ट्रक्टर कॉल हैं यह वास्तव में अधिक धागा-सुरक्षित नहीं है (जब तक आपको अपने कंस्ट्रक्टरों में कुछ पागल थ्रेडिंग तर्क नहीं मिलते हैं - मुझे निश्चित रूप से उम्मीद नहीं है)।
मुझे किस संभावित समस्याओं का सामना करना होगा अगर मैं इस दृष्टिकोण का पीछा करता हूं?
आपके प्रतिनिधियों को आमंत्रित करने से सीधे परिणाम नहीं फिर, धागा-सुरक्षा के बारे में केवल चिंताएं आपको चिंता होनी चाहिए, जो आपके प्रतिनिधियों (इस मामले में, UPDATE : लिम्पालेक्स ने एक अच्छा अवलोकन बनाया: आपके द्वारा पोस्ट किए गए कोड में, आप वास्तव में कॉलिंग the LdapAuthenticationProvider
और EFUnitOfWorkFactory < कोड>)।
uninitialized & lt ; TService & gt;
आपके ApplicationContext
वर्ग के लिए स्थिर कन्स्ट्रक्टर में विधि है, जो अपवाद फेंक देगा। आप क्या करना चाहते हैं असाइन करें अपने प्रतिनिधियों को विधि में। मुझे लगता है कि आप के लिए क्या चल रहे हैं, इस तरह से कुछ है:
// नोट: फ़ंक्शनल मिलान करने के लिए TService को बदल दिया गया वापसी प्रकार & lt; TService & gt; हस्ताक्षर निजी स्थिर TService Uninitialized & lt; TService & gt; () {नया अमान्यऑपरेशन एक्सपशन (); } // नोट: विधि कॉल सार्वजनिक स्थिर Func & lt; IAuthenticationProvider & gt; के बजाय असाइनमेंट करने के लिए हटाए गए () प्रतीकों प्रमाणीकरणप्रदाता = अपरिवर्तित & lt; IAuthenticationProvider & gt;; सार्वजनिक स्थिर Func & lt; IUnitOfWorkFactory & gt; UnitOfWorkFactory = अपरिवर्तित & lt; IUnitOfWorkFactory & gt;;
Comments
Post a Comment