2008-09-08 13 views
7

मेरे पास बहु-थ्रेडिंग की मूलभूत सीएस-प्रमुख समझ है लेकिन किसी एप्लिकेशन में सरल टाइमर से परे कुछ भी नहीं करना पड़ा है। क्या किसी को एक अच्छे संसाधन के बारे में पता है जो मुझे एक दौरे देगा कि बहु-थ्रेडेड अनुप्रयोगों के साथ कैसे काम करना है, मूल बातें समझाएं और शायद कुछ और कठिन चीजें प्रस्तुत करें?मैं सिद्धांत में थ्रेडिंग समझता हूं लेकिन अभ्यास में नहीं .net

उत्तर

23

यह जोसेफ अल्बाहारी द्वारा एक महान मुक्त संसाधन है।

  • BackgroundWorker नियंत्रण
  • WaitHandles
  • कॉलबैक कार्यों
  • मतदान एक ASyncResult वस्तु

आम तौर पर आप चाहते हैं: Threading in C#

5

वहाँ नेट में धागे सिंक्रनाइज़ करने के लिए 4 बुनियादी तरीके हैं उस सूची के शीर्ष पर शुरू करने और काम करने के लिए। इसका मतलब है कि पहले देखो और देखें कि क्या बैकग्राउंडर नियंत्रण स्थिति के लिए उपयुक्त है या नहीं। हालांकि, यह बहुत अधिक खिड़कियों के रूपों को मानता है और आप केवल एक नया धागा पैदा कर रहे हैं।

तो अगली कोशिश करें waithandles। Waithandles एक साथ कई धागे समन्वय के लिए अच्छे हैं। आप उन्हें सभी को लात मार सकते हैं और उन सभी के लिए इंतजार कर सकते हैं, या यदि आप एक निश्चित संख्या को सक्रिय रखना चाहते हैं तो आप केवल एक के लिए प्रतीक्षा करते रहें और इसे समाप्त होने पर अगली बार झुकाएं। या शायद आप जानते हैं कि एक धागा बहुत जल्द खत्म हो जाएगा, तो आप इसे खत्म करने के लिए इंतजार कर सकते हैं, थोड़ा सा काम कर सकते हैं, और फिर बाकी के खत्म होने की प्रतीक्षा कर सकते हैं।

वाईथैंडल्स थोड़ा अधिक प्रतीत हो सकता है, कहें, आप केवल एक अतिरिक्त धागे को जन्म दे रहे हैं और आप इसे समाप्त होने तक अवरुद्ध नहीं करना चाहते हैं। फिर आप कॉलबैक का उपयोग कर सकते हैं, ताकि आपके द्वारा निर्दिष्ट फ़ंक्शन को थ्रेड पूर्ण होने के तुरंत बाद बुलाया जाएगा।

अंत में, अगर और केवल अगर किसी कारण से उपरोक्त में से कोई भी काम नहीं करेगा तो आप मतदान पर वापस आ सकते हैं। सामान्य रूप से (BackgoundWorker सहित) WinForms घटना के परिणाम के रूप में,

  • ओएस बनाया:

    मैं 5 अलग अलग तरीकों से एक नया धागा क्रम में भी मोटे तौर पर, नेट में प्राप्त करने के लिए के बारे में सोच सकते हैं।

  • Obj.Begin ___()/End ____()। कुछ सीएलआर कक्षाओं में आपके लिए पहले से ही इन असीमित तरीकों को परिभाषित किया गया है, और जाहिर है कि आप उपलब्ध होने पर उनका उपयोग करना चाहते हैं।
  • ThreadPool.QueueUserWorkItem()। अपने स्वयं के धागे बनाने के लिए इस समय का अधिकतर उपयोग करें।
  • प्रतिनिधि। बेजिन इनवोक()/एंडइनवोक()। आप इस तरह से किसी भी विधि लपेट सकते हैं।
  • थ्रेड। स्टार्ट()। आप इसे इस तरह से कर सकते हैं, लेकिन मैंने हाल ही में कुछ पढ़ा है (अब लिंक नहीं है) कि यदि QueueUserWorkItem प्रतिनिधि विधि काम नहीं करेगा तो शायद बेहतर होगा।
11

दो महान लेख:

What Every Dev Must Know About Multithreaded Apps
Understand the Impact of Low-Lock Techniques in Multithreaded Apps

भले ही यह लेख नहीं है आप विशेष रूप से के लिए वास्तव में क्या देख रहे हैं, यह उम्मीद है कि आम तौर पर सहायता के लिए किया जाएगा (यानी यह संबंधित है, और एक बहुत अच्छा पढ़ा है):

The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software

1

सबसे अच्छा संसाधन मैं इस विषय पर पता में से एक पुस्तक 'सी # में सूत्रण "है बहु थ्रेडेड अनुप्रयोगों को प्रोग्राम करने के लिए समझने की आवश्यकता है।

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