क्या एक स्थिर वर्ग में स्थिर कार्य हो सकता है जो yield return
का उपयोग करता है ताकि एक IENumerable सुरक्षित रूप से एकाधिक धागे से बुलाया जा सके?उपज वापसी पुनर्वित्त है?
public static IEnumerable<FooClass> FooClassObjects()
{
foreach (FooClassWrapper obj in listOfFooClassWrappers)
{
yield return obj.fooClassInst;
}
}
क्या प्रत्येक थ्रेड जो इसे हमेशा कॉल करता है, संग्रह में प्रत्येक ऑब्जेक्ट का संदर्भ प्राप्त करता है? मेरी स्थिति में listOfFooClassWrappers
प्रोग्राम की शुरुआत में एक बार लिखा जाता है, इसलिए मुझे इस फ़ंक्शन के कॉल के दौरान इसे बदलने के बारे में चिंता करने की आवश्यकता नहीं है। मैंने इसका परीक्षण करने के लिए एक सरल कार्यक्रम लिखा, और मुझे समस्याओं का कोई संकेत नहीं दिख रहा था, लेकिन थ्रेडिंग मुद्दों को सुलझाना मुश्किल हो सकता है और यह संभव है कि यह मुद्दा केवल मेरे द्वारा किए गए रनों के दौरान दिखाई न दे।
संपादित करें: Is yield return in C# thread-safe? समान है लेकिन स्थिति को संबोधित करता है जहां संग्रह को फिर से चालू किया जाता है। मेरी चिंताओं के साथ एक छिपे हुए साझा इटरेटर के कारण संग्रह के केवल एक हिस्से को प्राप्त करने वाले कई धागे के साथ और अधिक करना है, क्योंकि कक्षा और विधि दोनों स्थिर हैं।
हां। http://stackoverflow.com/questions/1379266/is-yield-return-in-c-sharp-thread-safe, https://startbigthinksmall.wordpress.com/2008/06/09/behind-the-scenes- ऑफ-द-सी-उपज-कीवर्ड /, http://stackoverflow.com/questions/4157771/thread-safety-of-yield-return-is-it प्रत्येक थ्रेड कॉलिंग 'FooClassObjects.GetEnumerator() '(जैसे' foreach (FooClassObjects में var foo) ') को अपने स्वयं के गणक मिलेगा, जो राज्य मशीन की अपनी प्रतिलिपि पर काम करेगा कि 'उपज रिटर्न' युक्त एक विधि में संकलित हो जाता है। – CodeCaster