2010-12-22 9 views
9

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

private void BtnStopAutoUpd_Click(object sender, EventArgs e) 
     { 
      autoReadThread.Suspend(); 
     } 

private void BtnStartAutoUpd_Click(object sender, EventArgs e) 
     { 
      autoReadThread.Resume(); 
     } 

लेकिन मैं इस चेतावनी का सामना करना पड़ रहा हूँ,

Thread.Suspend मान्य नहीं है। सिस्टम में अन्य वर्गों का उपयोग करें। थ्रेड या संसाधनों की सुरक्षा के लिए मॉनिटर, म्यूटेक्स, इवेंट, और सेमफोर जैसे थ्रेडिंग। http://go.microsoft.com/fwlink/?linkid=14202

कोई भी मैं केवल एक धागा चलाता हूं (जीयूआई थ्रेड के बजाए), तो मैं यहाँ सिंक्रनाइज़ेशन कैसे लागू कर सकता हूं या मॉनीटर कर सकता हूं।

अद्यतन कोड:

class ThreadClass 
{ 

    // This delegate enables asynchronous calls for setting the text property on a richTextBox control. 
    delegate void UpdateTextCallback(object text); 

    // create thread that perform actual task 
    public Thread autoReadThread = null; 

    public ManualResetEvent _event = new ManualResetEvent(true); 

    // a new reference to rich text box 
    System.Windows.Forms.RichTextBox Textbox = null; 

    private volatile bool _run; 

    public bool Run 
    { 
     get { return _run; } 
     set { _run = value; } 
    } 

    public ThreadClass(string name, System.Windows.Forms.RichTextBox r1) 
    { 
     Textbox = r1; 
     Run = true; 
     this.autoReadThread = new Thread(new ParameterizedThreadStart(UpdateText)); 
     this.autoReadThread.Start(name); 
    } 

    private void UpdateText(object fileName) 
    { 

     //while (true) 
     //{ 
     // _event.WaitOne(); 
      while (Run) 
      { 

       if (Textbox.InvokeRequired) 
       { 
        UpdateTextCallback back = new UpdateTextCallback(UpdateText); 
        Textbox.BeginInvoke(back, new object[] { fileName }); 
        Thread.Sleep(1000); 
       } 

       else 
       { 
        string fileToUpdate = (string)fileName; 
        using (StreamReader readerStream = new StreamReader(fileToUpdate)) 
        { 
         Textbox.Text = readerStream.ReadToEnd(); 
        } 
        break; 
       //} 
      } 
     }  
    } 

} 

}

रन bool मूल्य, एक धागा यह (शुरू में अपने असली)

और धागा शुरू करने के लिए मैं इस वर्ग के उदाहरण बनाकर कर रहा हूँ (इस शुरुआत को नियंत्रित करता है अन्य वर्ग में धागा भी)

+0

आप अपडेट नहीं दिखाते हैं: ए) आपका धागा कैसे शुरू होता है, बी) पूर्ण थ्रेड विधि। – jgauffin

+0

InvokeRequired हमेशा सच है। आपका धागा कुछ भी उपयोगी नहीं करता है, सब कुछ यूआई थ्रेड पर चलता है। –

उत्तर

8
//true makes the thread start as "running", false makes it wait on _event.Set() 
    ManualResetEvent _event = new ManualResetEvent(true); 
    Thread _thread = new Thread(ThreadFunc); 

    public void ThreadFunc(object state) 
    { 
     while (true) 
     { 
      _event.Wait(); 

      //do operations here 
     } 
    } 


    _thread.Start(); 

    // to suspend thread. 
    _event.Reset(); 

    //to resume thread 
    _event.Set(); 

ध्यान दें कि सभी कार्यों को पूरा कर रहे हैं हो सामने धागा "निलंबित" है

क्या आप

private void ThreadFunc(object fileName) 
{ 
    string fileToUpdate = (string)fileName; 
    while (Run) 
    { 
     _event.WaitOne(); 

     string data; 
     using (StreamReader readerStream = new StreamReader(fileToUpdate)) 
     { 
      data = readerStream.ReadToEnd(); 
     } 

     if (Textbox.InvokeRequired) 
     { 
      UpdateTextCallback back = new UpdateTextCallback(UpdateText); 
      Textbox.BeginInvoke(back, new object[] { data }); 
     } 

       Thread.Sleep(1000); 
    }  
} 


private void UpdateText(string data) 
{ 
    Textbox.Text = data; 
} 
+0

काम नहीं कर रहा है ... निष्पादन _event.Wait() पर बंद हो जाता है; उसके बाद मेरे परिचालन निष्पादित नहीं हो रहे हैं। – PawanS

+0

क्या आपने '_event.Set()' का उपयोग करने का प्रयास किया है? मैंने प्रारंभिक स्थिति को 'मैन्युअल रीसेट इवेंट' पर 'झूठा' पर सेट किया है जो इसे – jgauffin

+0

जारी रखने से पहले सेट पर प्रतीक्षा करता है, मैं वहां नहीं पहुंचा था। after_evenr.Wait() मैंने निष्पादन प्राप्त करने के लिए अपना कोड लिखा था, लेकिन वहां केवल stmnt hangs प्रतीक्षा करें। _event.reset और _evenr.Set मैंने बटन घटनाओं में लिखा था। – PawanS

5

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

समाधान करना चाहिए एक WaitHandle (शायद AutoResetEvent या ManualResetEvent) जो आप अपने autoReadThread को संकेत देना बंद करो/शुरू करने के लिए उपयोग कर सकते हैं शामिल किया गया।

3

मैं धागे को रोकने और फिर से शुरू करने के लिए मॉनीटर तंत्र का उपयोग करूंगा। मॉनिटर.एट थ्रेड को मॉनीटर के लिए इंतजार कर देगा। पल्स।

private bool _pause = false; 
private object _threadLock = new object(); 

private void RunThread() 
{ 
    while (true) 
    { 
     if (_pause) 
     { 
      lock (_threadLock) 
      { 
       Monitor.Wait(_threadLock); 
      } 
     } 

     // Do work 
    } 
} 

private void PauseThread() 
{ 
    _pause = true; 
} 

private void ResumeThread() 
{ 
    _pause = false; 
    lock (_threadLock) 
    { 
     Monitor.Pulse(_threadLock); 
    } 
}