मल्टी # थ्रेडिंग विद सी # विद टास्क

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

किसी अनुप्रयोग में एक या अधिक प्रक्रियाएँ होती हैं। एक प्रक्रिया को अपने कंप्यूटर पर चलने वाले प्रोग्राम के रूप में सोचें। अब प्रत्येक प्रक्रिया में एक या एक से अधिक धागे होते हैं। एक गेम एप्लिकेशन में डिस्क से संसाधनों को लोड करने के लिए एक धागा हो सकता है, दूसरा एआई करने के लिए, और दूसरा गेम को सर्वर के रूप में चलाने के लिए।

.NET / Windows में, ऑपरेटिंग सिस्टम एक थ्रेड के लिए प्रोसेसर समय आवंटित करता है। प्रत्येक थ्रेड अपवाद हैंडलर का ट्रैक रखता है और प्राथमिकता उस पर चलती है, और इसमें कहीं न कहीं थ्रेड संदर्भ को सहेजने तक चलता है। थ्रेड संदर्भ वह जानकारी है जिसे थ्रेड को फिर से शुरू करने की आवश्यकता होती है।

थ्रेड्स के साथ मल्टी-टास्किंग

थ्रेड्स स्मृति को थोड़ा ऊपर उठाते हैं और उन्हें बनाने में थोड़ा समय लगता है, इसलिए आमतौर पर, आप कई का उपयोग नहीं करना चाहते हैं। याद रखें, वे प्रोसेसर समय के लिए प्रतिस्पर्धा करते हैं। यदि आपके कंप्यूटर में एक से अधिक CPU हैं, तो Windows या .NET प्रत्येक थ्रेड को एक अलग CPU पर चला सकता है, लेकिन यदि कई थ्रेड्स एक ही सीपीयू पर चलते हैं, फिर एक समय में केवल एक ही सक्रिय हो सकता है और स्विचिंग थ्रेड लेता है समय।

instagram viewer

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

एक धागा बनाना

नेमस्पेस सिस्टम में। थ्रेडिंग, आपको थ्रेड प्रकार मिलेगा। कंस्ट्रक्टर धागा (थ्रेडस्टार्ट) एक थ्रेड का एक उदाहरण बनाता है। हालाँकि, हाल में सी# कोड, यह एक लैम्ब्डा अभिव्यक्ति में पारित होने की अधिक संभावना है जो किसी भी पैरामीटर के साथ विधि को कॉल करता है।

यदि आप अनिश्चित हैं लंबोदर भावयह LINQ की जाँच के लायक हो सकता है।

यहाँ एक धागे का एक उदाहरण है जो बनाया और शुरू किया गया है:

सिस्टम का उपयोग;
सिस्टम का उपयोग कर। थ्रेडिंग;
नामस्थान ex1
{
कक्षा कार्यक्रम
{
सार्वजनिक स्थैतिक शून्य लिखना 1 ()
{
कंसोल। लिखो ('1');
थ्रेड। नींद (500);
}
स्थिर शून्य मुख्य (स्ट्रिंग [] args)
{
var कार्य = नया थ्रेड (Write1);
कार्य। शुरू() ;
के लिए (var i = 0; i <10; मैं ++)
{
कंसोल। लिखो ('0');
कंसोल। लिखना (कार्य)। जिंदा है? 'ए': 'डी');
थ्रेड। नींद (150);
}
कंसोल। कुंजी पढ़ें() ;
}
}
}

यह सब उदाहरण कंसोल को "1" लिखता है। मुख्य थ्रेड कंसोल पर "0" को 10 बार लिखता है, हर बार उसके बाद "ए" या "डी" होता है जो इस बात पर निर्भर करता है कि दूसरा धागा अभी भी जिंदा है या मृत।

दूसरा धागा केवल एक बार चलता है और "1." लिखता है राइट -1 () थ्रेड में आधे सेकंड की देरी के बाद, थ्रेड खत्म हो जाता है, और टास्क। मुख्य लूप में अलग है अब "डी" लौटाता है

थ्रेड पूल और टास्क समानांतर लाइब्रेरी

अपना खुद का धागा बनाने के बजाय, जब तक आपको वास्तव में इसे करने की आवश्यकता न हो, थ्रेड पूल का उपयोग करें। .NET 4.0 से, हमारे पास टास्क पैरेलल लाइब्रेरी (TPL) तक पहुंच है। पिछले उदाहरण के रूप में, फिर से हमें LINQ का थोड़ा सा हिस्सा चाहिए, और हाँ, यह सभी लंबोदर भाव हैं।

कार्य का उपयोग करता है धागा पूल पर्दे के पीछे लेकिन उपयोग में संख्या के आधार पर थ्रेड्स का बेहतर उपयोग करें।

TPL में मुख्य वस्तु एक टास्क है। यह एक वर्ग है जो एक अतुल्यकालिक ऑपरेशन का प्रतिनिधित्व करता है। चलने वाली चीजों को शुरू करने का सबसे सामान्य तरीका टास्क के साथ है। फैक्टरी। इसके अनुसार प्रारंभ करें:

टास्क। फैक्टरी। StartNew () (> = DoSomething ());

जहां DoSomething () वह विधि है जिसे चलाया जाता है। एक कार्य बनाना संभव है और इसे तुरंत नहीं चलाया जाना चाहिए। उस स्थिति में, बस इस तरह टास्क का उपयोग करें:

var t = नई टास्क () => कंसोल। WriteLine ( "हैलो"));
...
टी। शुरू();

यह तब तक धागा शुरू नहीं करता है जब तक .Start () को नहीं कहा जाता है। नीचे दिए गए उदाहरण में, पाँच कार्य हैं।

सिस्टम का उपयोग;
सिस्टम का उपयोग कर। थ्रेडिंग;
सिस्टम का उपयोग कर। थ्रेडिंग। कार्य;
नामस्थान ex1
{
कक्षा कार्यक्रम
{
सार्वजनिक स्थैतिक शून्य लिखना 1 (int i)
{
कंसोल। लिखो (i);
थ्रेड। नींद (50);
}
स्थिर शून्य मुख्य (स्ट्रिंग [] args)
{
के लिए (var i = 0; i <5; मैं ++)
{
var value = i;
var रनिंगटस्क = टास्क। फैक्टरी। StartNew () (> = Write1 (मान));
}
कंसोल। कुंजी पढ़ें() ;
}
}
}

उसे चलाएं और आप कुछ यादृच्छिक क्रम में 4 आउटपुट के माध्यम से अंक 0 प्राप्त करें जैसे कि 03214। ऐसा इसलिए है क्योंकि कार्य निष्पादन का क्रम .NET द्वारा निर्धारित किया जाता है।

आप सोच रहे होंगे कि var value = i की जरूरत क्यों है। इसे हटाने और लिखने (i) को कॉल करने का प्रयास करें, और आपको 55555 की तरह कुछ अप्रत्याशित दिखाई देगा। ऐसा क्यों है? यह इसलिए है क्योंकि यह कार्य उस समय के मान को दिखाता है जब कार्य निष्पादित किया गया था, न कि जब कार्य बनाया गया था। एक नया निर्माण करके परिवर्तनशील लूप में हर बार, पाँच मानों में से प्रत्येक सही ढंग से संग्रहीत और उठाया जाता है।

instagram story viewer