2012-03-06 9 views
6

मैं वीएस 2010 में सी # .Net4.0 का उपयोग कर रहा हूं। मैं Thread को पुनरारंभ कैसे करूं?सी # नेट 4.0 में थ्रेड को पुनरारंभ कैसे करें?

ऐसा लगता है कि मैं Abort() धागा और Start() इसे फिर से शुरू करना चाहता हूं? क्या यह संभव है?

+1

सामान्य रूप से, 'थ्रेड में' abort() 'एक बुरा विचार है। आप किस समस्या को हल करना चाहते हैं? – Heinzi

+0

यह आपकी मदद कर सकता है: - [सी # 4.0 में एक धागा पुन: प्रारंभ हो] [1] [1]: http://stackoverflow.com/questions/1054889/restarting-a-thread-in-net- उपयोग-सी – Misam

+0

धागे को रोकने और शुरू करने की आवश्यकता थोड़ा असामान्य है - आप जिस समस्या को हल करने की कोशिश कर रहे हैं? – dice

उत्तर

7

धागे का नया उदाहरण बनाएं और फिर से निष्पादित करें। थ्रेड 1 = नया थ्रेड(); thread1.start();

7

धागे को छोड़ना अक्सर एक बुरा विचार है। वह एक सलाहकार है। यदि यह एक अनंत लूप है, तो एक बूलियन गर्भपात के बिना धागे को रोकने के लिए प्रयोग किया जाता है।

bool run = true; 
Thread thread = new Thread(method); 
thread.start(); 

private void method() 
{ 
    while(run) 
    { 

    } 
} 

धागा रोकने के लिए, बस गलत पर बूलियन सेट और सामान्य रूप से, आप इसे बाद पुनः आरंभ कर सकते हैं।

+1

अच्छी सलाह। कंपाइलर अनुकूलन के कारण अनिश्चितकालीन प्रतीक्षा से बचने के लिए 'रन'' अस्थिर होना चाहिए। – Tudor

+1

'लॉक' का उपयोग करने पर विचार करें, खासकर जब बूलियन मान सेट करते हैं। 'मॉनिटर' के साथ संयोजन में इसका उपयोग करके भी बेहतर। यहां एक नज़र डालें: http://stackoverflow.com/questions/1559293/c-sharp-monitor-wait-pulse-pulseall#1559662 –

+0

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

2

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

यदि आप प्रबंधित कोड में सबकुछ कर रहे हैं और अप्रबंधित संसाधनों द्वारा लॉक नहीं हो रहे हैं, और आपको थ्रेड को रोकना होगा, थ्रेड। एबॉर्ट() बिल्कुल ठीक है।

हालांकि, आप समाप्त होने वाले थ्रेड पर प्रारंभ नहीं कर सकते हैं। आपको उस थ्रेड पर एक और थ्रेड बनाना होगा और कॉल शुरू करना होगा। थ्रेड सृजन कुछ हद तक महंगा है, स्मृति के अनुसार, .NET में (अन्य languges की तुलना में), इसलिए कुछ कमियां हैं।

+0

वास्तव में धागे को बार-बार बनाना बहुत महंगा नहीं होता क्योंकि यह बहुत बार नहीं किया जाता है। – Shashwat

1

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

1

चूंकि आप .NET 4.0 का उपयोग कर रहे हैं, जहां एमएस ने "सहकारी रद्दीकरण फ्रेमवर्क" पेश किया था। आप इस blog से और अधिक पढ़ सकते हैं। सीधे थ्रेड से निपटना (अधिक से अधिक) निराश है।

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