2009-03-18 13 views
5

.NET में मुझे कैसे पता चलेगा कि कोई वर्ग या विधि थ्रेड सुरक्षित है या नहीं? क्या यह डिफ़ॉल्ट रूप से थ्रेड सुरक्षित नहीं है?क्या .NET में कक्षा या विधि को सुरक्षित रखने के लिए कोई विशेषता है?

+0

पर कॉल करने के दौरान सूची को बदलने का समय आपको किस उद्देश्य के लिए पसंद करेगा? – AnthonyWJones

+1

क्लास उपयोगकर्ता –

+0

को चेतावनी देने के लिए कोड प्रलेखन का एक प्रकार हो सकता है यदि वह सिर्फ दस्तावेज़ीकरण चाहता है, तो वह इसे अनुभाग में डाल सकता है। –

उत्तर

6

यह इसके लिए कोई विशेषता नहीं है: आपको अपनी रुचि रखने वाले प्रत्येक आइटम के लिए प्रलेखन को पढ़ना होगा। आप इसमें कोई विशेषता जोड़कर कुछ थ्रेड सुरक्षित नहीं कर सकते हैं। यह एक नारंगी लेने और उस पर एक स्टिकर डालने जैसा है, "ऐप्पल" कहता है।

बेशक, वही बात क्रमबद्धता के लिए सच है और यह उन्हें वहां नहीं रोकती है, लेकिन फिर भी: कोई विशेषता नहीं है। दस्तावेज़ पढ़ें।

+0

रोकें सभी स्थिर विधियों और गुणों को डिफ़ॉल्ट रूप से थ्रेड सुरक्षित माना जाता है (यानी अन्यथा दस्तावेज किए जाने तक), उदाहरण के लिए विधियों की धारणा यह है कि वे नहीं हैं। – Richard

+0

किसी विधि को मानना ​​धागा सुरक्षित नहीं है जब यह कोई नुकसान नहीं पहुंचाता है, मानते हैं कि कोई थ्रेड सुरक्षित है जब यह बुरा नहीं हो सकता है। इंगित करने के लिए आपका बेहतर बंद कुछ भी धागा सुरक्षित नहीं है। – JoshBerke

1

मुझे इस पर जोएल कोहौर्न पर मेरी पीठ मिली, इस तरह के दावों को 'नकली' करना आसान होगा।

क्यों नहीं समारोह वर्णन में threadsafe पाठ जोड़ने

+0

मैं इसे 'फिकिंग' के बारे में बहुत ज्यादा चिंता नहीं करता। लेकिन समेकन कठिन है: यह बहुत संभावना है कि एक बग फिसल गया है और वह विशेषता सिर्फ गलत है। –

+2

लेकिन यदि विशेषता गलत है, तो संभव है कि दस्तावेज़ (यदि कोई हो) गलत होगा। –

+0

मैं पूरी तरह से @ जिममिशेल से सहमत हूं, लेकिन जोएल वह नहीं था जो दस्तावेज़ीकरण की वकालत कर रहा था। कम से कम गुण मशीन-पठनीय हैं, जो जिम्मेदार तरीकों के न्यूनतम, स्वचालित गणना, फ़िल्टरिंग, रिपोर्टिंग इत्यादि के लिए अनुमति देते हैं, और संभावित रूप से स्थिर विश्लेषण और/या त्रुटि रोकथाम के कुछ कमजोर रूप भी हैं।गुण जाने का तरीका हैं, लेकिन किसी भी वास्तव में उपयोगी तरीके से समवर्ती अर्थशास्त्र को पकड़ने के लिए आपको उनमें एक विस्तृत और व्यापक प्रणाली की आवश्यकता होगी। .NET के लिए, मुझे इस तरह के किसी भी डिजाइन या प्रस्ताव से अवगत नहीं है। –

-1

एक वर्ग, सिंक्रनाइज़ जहाँ तक विधि का सवाल है आप कोडिंग शैली का अनुसरण इस्तेमाल कर रही है का कोई उपयोग नहीं स्थिति नहीं है:

using System.Runtime.CompilerServices; 
[MethodImpl(MethodImplOptions.Synchronized)] 
void MyMethod() 
{ 
DoSomething(); 
} 
+0

समस्या है; जो अभी भी यह नहीं दर्शाता है कि विधि थ्रेड-सुरक्षित है - क्योंकि एक और थ्रेड एक अलग विधि को कॉल कर सकता है जिसमें * [MethodImpl] नहीं है, इस प्रकार प्रत्येक-दूसरे को कचरा कर रहा है। इसी प्रकार यदि सभी फ़ील्ड केवल पढ़े जाते हैं, तो बाल वस्तुओं पर फ़ील्ड उत्परिवर्तनीय हो सकते हैं, और समस्याएं पैदा हो सकती हैं। –

+0

भले ही यह तथाकथित "कोडिंग शैली" * कुछ * संकेत दे सकता है (इस पृष्ठ पर कई अन्य टिप्पणियां देखें), 'MethodImplOptions.Synchronized' ध्वज का ओपी क्या ढूंढ रहा है इसका विपरीत अर्थ है। यह ध्वज यह इंगित करने के लिए है कि विधि ** ** ** थ्रेड-सुरक्षित नहीं है। दस्तावेज़ीकरण से: "विधि को एक समय में केवल एक धागे द्वारा निष्पादित किया जा सकता है।" –

1

यह IContributeObjectSink/IContextAttribute के माध्यम से अपने ऑब्जेक्ट सीरियल तक पहुंच बनाने के लिए संभव है, हालांकि यह एक बड़ी प्रदर्शन हिट से पीड़ित होगा क्योंकि इसे आपके ऑब्जेक्ट को MarshalByRefObject, संदर्भ निर्माण ओवरहेड आदि को उपclass करने की आवश्यकता होगी ...

1

नहीं, और यह व्यर्थ होगा।

void Add(something); 
void Remove(index); 
int GetCount(); 
something GetElementAt(index); 

थ्रेड एक:

for 1 to 100 do 
list.Add(12); 

थ्रेड दो और तीन:

चलो मैं एक धागा सुरक्षित सूची है मान लेते हैं, यह तीन थ्रेड तरीकों ™ सुरक्षित है

while(list.GetCount() >0) 
{ 
    list.Remove(0); 
} 

उपरोक्त कोड क्रैश (जल्दी या बाद में) क्रैश हो जाएगा क्योंकि आप GetCount और Remove

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

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