2010-03-12 10 views
9

मैं सी # में एक आवेदन कर रहा हूं जो जीयूआई के रूप में एक विनफॉर्म का उपयोग करता है और एक अलग थ्रेड जो पृष्ठभूमि में स्वचालित रूप से चीजों को बदल रहा है। पूर्व:थ्रेड को रोकने/निलंबित करने के लिए कैसे जारी रखें?

public void Run() 
{ 
    while(true) 
    { 
     printMessageOnGui("Hey"); 
     Thread.Sleep(2000); 
     // Do more work 
    } 
} 

मैं लूप में कहीं भी इसे कैसे रोकूं, क्योंकि लूप का एक पुनरावृत्ति लगभग 30 सेकंड लेता है। तो मैं इसे एक लूप करने के बाद इसे रोकना नहीं चाहता, मैं इसे समय पर रोकना चाहता हूं।

उत्तर

14
ManualResetEvent mrse = new ManualResetEvent(false); 

public void run() 
{ 
    while(true) 
    { 
     mrse.WaitOne(); 
     printMessageOnGui("Hey"); 
     Thread.Sleep(2000); . . 
    } 
} 

public void Resume() 
{ 
    mrse.Set(); 
} 

public void Pause() 
{ 
    mrse.Reset(); 
} 
+1

त्वरित नोट: जैसा कि लिखा गया है, यह उदाहरण रोके गए राज्य में शुरू होगा (जैसा कि 'नए मैनुअल रीसेट इवेंट (झूठी);' लाइन में निर्देशित है)। धन्यवाद @Lirik –

+0

मुझे भी एक ही समस्या का सामना करना पड़ रहा है .. बहुत धन्यवाद @ लिरिक। आपकी आत्मा ने भी मेरे लिए काम किया। –

1

आप thread.Suspend पर कॉल करके थ्रेड को रोक सकते हैं लेकिन यह बहिष्कृत है। मैं आपके सिंक्रनाइज़ेशन करने के लिए autoresetevent पर एक नज़र डालेगा।

1

आपको इसे ManualResetEvent के माध्यम से करना चाहिए।

ManualResetEvent mre = new ManualResetEvent(); 
mre.WaitOne(); // This will wait 

एक और धागा पर, जाहिर है आप, MRE

mre.Set(); // Tells the other thread to go again 

एक पूर्ण उदाहरण जो कुछ पाठ प्रिंट होगा के लिए एक संदर्भ की आवश्यकता होगी एक और धागा के लिए इंतजार कुछ करने के लिए और उसके बाद फिर से शुरू:

class Program 
{ 
    private static ManualResetEvent mre = new ManualResetEvent(false); 

    static void Main(string[] args) 
    { 
     Thread t = new Thread(new ThreadStart(SleepAndSet)); 
     t.Start(); 

     Console.WriteLine("Waiting"); 
     mre.WaitOne(); 
     Console.WriteLine("Resuming"); 
    } 

    public static void SleepAndSet() 
    { 
     Thread.Sleep(2000); 
     mre.Set(); 
    } 
}