2010-12-22 157 views
9

在我的应用程序中,我正在通过另一个线程(其他GUI线程)执行我的文件读取。有两个按钮分别暂停和恢复线程。C#Threading.Suspend已废弃,线程已被弃用?

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

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

,但我面对这样的警告,

Thread.Suspend已被弃用。请使用System.Threading中的其他类(如Monitor,Mutex,Event和Semaphore)来同步线程或保护资源。 http://go.microsoft.com/fwlink/?linkid=14202

任何如何运行只有单线程(而不是GUI线程),所以我如何在这里应用同步或监视。

更新代码:

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; 
       //} 
      } 
     }  
    } 

} 

}

运行是布尔值,线程控制它(最初真的)

,并启动线程我创建这个类的实例(此启动螺纹也)其他类

+0

您更新不显示:a)您的线程是如何启动的,b)完整的线程方法。 – jgauffin 2010-12-22 13:35:30

+0

InvokeRequired始终为真。你的线程没有做任何有用的事情,一切都在UI线程上运行。 – 2010-12-22 14:29:06

回答

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; 
} 
5

原因挂起和恢复已被取消是因为没有保证在执行过程中什么时候该线程将被暂停什么。这是一件坏事。该问题描述为here以及解决方案。

的解决方案应该涉及到的WaitHandle(可能的AutoResetEvent或ManualResetEvent的),你可以用它来通知您autoReadThread停止/启动。

3

我会用实现暂停和恢复线程的监控机制。 Monitor.Wait将导致线程等待Monitor.Pulse。

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); 
    } 
}