2009-06-28 17 views
10

मैं एक तरह से एक धागा है कि बीच में बंद करें() ...NET में एक धागा पुन: प्रारंभ हो

public partial class MyProgram : Form 
{ 
    private Thread MyThread = new Thread(MyFunction); 
    private System.Windows.Forms.Button startStopBtn = new System.Windows.Forms.Button(); 
    public MyProgram() 
    { 
    MyThread.Start(); 
    startStopBtn += new EventHandler(doStop); 
    startStopBtn.Text = "Stop"; 
    } 
    private static void MyFunction() 
    { 
    // do something 
    } 
    private void doStop(object sender, EventArgs e) 
    { 
    MyThread.Abort(); 
    startStopBtn -= new EventHandler(doStop); 
    startStopBtn += new EventHandler(doStart); 
    startStopBtn.Text = "Start"; 
    } 
    private void doStart(object sender, EventArgs e) 
    { 
    MyThread.Start(); // << Error returned when clicking the button for 2nd time 
    startStopBtn -= new EventHandler(doStart); 
    startStopBtn += new EventHandler(doStop); 
    startStopBtn.Text = "Stop"; 
    } 
} 

किसी भी विचार से रोक दिया गया है को पुनः आरंभ करने के लिए देख रहा हूँ (सी # का उपयोग करके)?

उत्तर

12

MySthread.Start() को doStart() में कॉल करने से पहले MyThread = new Thread (MyFunction) जोड़ें। अपने तरीकों के बाहर धागा मत बनाओ, अंतरिक्ष के लिए घोषणाओं के बारे में सोचा जाता है।

संपादित करें: कृपया ध्यान दें कि थ्रेड के साथ धागे को मारना। एबॉर्ट() बहुत खतरनाक हो सकता है। आपको स्वच्छ मल्टीथ्रेडिंग को पूरा करने की कोशिश करनी चाहिए, जैसे ग्रो ने अपनी पोस्ट में वर्णित किया है।

+0

यह उत्तर वास्तविक उत्तर से अधिक कामकाज है। यह भी समझाओ कि उसे एक त्रुटि क्यों मिलती है। ग्रू को यह सही मिला। – Trap

+3

आप सही हैं, लेकिन जब मैं प्रोग्रामिंग शुरुआती था, तो मुझे कई समान समस्याएं थीं। मैं इस तरह के कई समाधानों को पढ़ रहा था, और हाँ, आप पूरी तरह से सही हैं, मेरा समाधान केवल एक कामकाज है। लेकिन जिन तंत्रों का वर्णन किया गया है वे मेरे प्रोग्रामिंग-नए समय में समझने के लिए बहुत जटिल थे। इसलिए, आप एक सरल "उत्तर" (या वर्कअराउंड) एक प्रोग्रामर के लिए इतना अनुभवी नहीं है। – Emiswelt

+0

यह वह चीज है जो खराब प्रोग्रामर बनाती है। वे यह समझने के लिए पर्याप्त समय नहीं निवेश करते कि वे क्या कर रहे हैं। ओ तुम्हारा थ्रेड साफ करने जा रहा है। जब आप चले गए हैं तो गड़बड़ हो? –

2

नहीं, ऐसा नहीं है, लेकिन आप क्यों चाहेंगे? बस एक ही थ्रेड स्टार्ट के साथ एक नया धागा शुरू करें, और एक ही पैरामीटर (यदि कोई हो)।

6

सरल उत्तर यह है कि आप नहीं कर सकते। एक बार धागा निरस्त कर दिया गया है, तो आप इसे पुनरारंभ नहीं कर सकते हैं। बस एक विधि या कुछ बनाएं, जो थ्रेड ऑब्जेक्ट देता है कि आपको इसकी आवश्यकता कैसे होती है। जब आपको एक नया थ्रेड चाहिए, तो उसे उस विधि से प्राप्त करें।

29

एक बार जब आप अपना धागा निरस्त कर देते हैं, तो आप इसे फिर से शुरू नहीं कर सकते हैं।

लेकिन आपकी वास्तविक समस्या यह है कि आप अपने धागे को निरस्त कर रहे हैं। आपको never use Thread.Abort() होना चाहिए।

यदि आपका धागा रोका और कई बार जारी रखा जाना चाहिए, तो आपको अन्य तंत्रों का उपयोग करने पर विचार करना चाहिए (उदाहरण के लिए AutoResetEvent)।

[संपादित करें]

एक धागा निरस्त करने के लिए सरल समाधान, के रूप में ऊपर के लिंक में Ian Griffiths से उल्लेख किया है, यह है:

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

केवल एक चीज है कि आप क्या करने की जरूरत यह ठीक से काम करने के लिए, इतना है कि यह एक पाश में चलाता अपनी पृष्ठभूमि विधि पुनर्व्यवस्थित करने के लिए है अलग धागा

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

This thread में प्रारंभ, रोकें, फिर से शुरू करें और रोकें विधियों के साथ एक ठोस उदाहरण शामिल है। ध्यान दें कि ब्रैनन का उदाहरण कभी थ्रेड को बंद करता है। यह केवल एक घटना को आग लगता है, और तब तक इंतजार करता है जब तक धागा सुन्दरता से खत्म न हो जाए।

0

यदि आपको वास्तव में थ्रेड फ़ंक्शन को बाधित करने और फिर से शुरू करने की आवश्यकता है, तो आपको एक शर्त निर्धारित करनी चाहिए और फिर प्रक्रिया के दौरान समय-समय पर जांच करनी चाहिए।

इससे आपको कुछ समय के लिए प्रसंस्करण रोकना होगा और फिर फिर से शुरू करना होगा।

मैंने घटनाओं का उपयोग किया है और एक समान कार्य को पूरा करने के लिए कॉल प्रतीक्षा करें।

0

सबसे आसान तरीका धागा को रद्द नहीं करना है।

-3

मुझे वास्तव में समझ में नहीं आ रहा है कि अगर लोग सही नहीं जानते हैं तो लोग जानकारी क्यों प्रदान करते हैं .. एक वास्तविक प्रोग्रामर कुछ समय के लिए थ्रेड को प्रोसेस करना बंद कर सकता है या फिर इसे छोड़ सकता है और इस प्रकार कोड को कमजोर बना सकता है .. । @ Brad-- मीटर खेद .. लेकिन अपने विचार अच्छा नहीं था .. @Rhythmic - आप चीजों दृष्टिकोण अपने रास्ते पर काम करने की जरूरत ..

BFree कुछ हद तक था सही अगर आप लोग उसे उसी तरह मिला वह कहना चाहता था .. आपको बस इसे फिर से घोषित करने की आवश्यकता है ..

नीचे उदाहरण है:

Public Shared Sub ResetAbort() 

    Dim ThreadPleaseWait As New Thread(New ThreadStart(AddressOf YourSubName)) 

    YourThreadName.Start() 

    Thread.Sleep(2000) 

    YourThreadName.Abort() 

End Sub 

अब आप इस सब का उपयोग कहीं भी थ्रेड शुरू करना चाहते हैं। यह स्वचालित रूप से धागे को निरस्त कर देगा।

आप button1_Click() घटना पर धागा शुरू करने और Button2_Click पर इसे रोकने के लिए चाहते हैं() घटना का उपयोग करें:

button1_Click में

() घटना

Dim ThreadPleaseWait As New Thread(New ThreadStart(AddressOf YourSubName)) 

    YourThreadName.Start() 
Button2_click में

() घटना

YourThreadName.Start() 

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

+5

कृपया अपना स्वरूपण ठीक करें। साथ ही, जब आप इसे संपादित कर रहे हों, तो आप इसे थोड़ा कम विद्रोही बनाना चाहेंगे। जबकि आपको "नहीं" शब्द पसंद नहीं है, आप * निरस्त धागे को पुनरारंभ नहीं कर सकते *। क्या ओपी पूछा संभव नहीं है। इसके अलावा, थ्रेड। एबॉर्ट() को हानिकारक माना जाता है। थ्रेड निष्पादन को नियंत्रित करने के लिए बहुत बेहतर तरीके हैं। आप बुरी चीजों को जारी रखने के लिए पूछने वाले की सेवा नहीं करते हैं। विकल्प देने के लिए बेहतर है जो एक ही जोखिम के बिना अपनी आवश्यकताओं को पूरा करता है। – Will

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