2015-12-14 12 views
13

क्या एक स्थिर वर्ग में स्थिर कार्य हो सकता है जो 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? समान है लेकिन स्थिति को संबोधित करता है जहां संग्रह को फिर से चालू किया जाता है। मेरी चिंताओं के साथ एक छिपे हुए साझा इटरेटर के कारण संग्रह के केवल एक हिस्से को प्राप्त करने वाले कई धागे के साथ और अधिक करना है, क्योंकि कक्षा और विधि दोनों स्थिर हैं।

+9

हां। 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

उत्तर

4

क्या एक स्थैतिक वर्ग में एक स्थैतिक फ़ंक्शन जो आईन्यूमेरेबल को सुरक्षित रूप से वापस करने के लिए उपज रिटर्न का उपयोग करता है, उसे कई धागे से सुरक्षित किया जा सकता है?

yield keywordIEnumerable<T> लौटने विधि/संपत्ति पुनरावर्तक बनाता है। भौतिक रूप से, इसे बुलाया जाता है और आंतरिक रूप से IEnumerable.GetEnumerator() कहा जाता है - जो थ्रेड-सुरक्षित है। यह एक उदाहरण देता है। इस व्याख्या बाहर

की जांच: https://startbigthinksmall.wordpress.com/2008/06/09/behind-the-scenes-of-the-c-yield-keyword/

साथ ही, इस एक समान तरीके से here में कहा गया है।

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