Search code examples
c#.netmultithreadingmonitoringdeadlock

C# Threading.Suspend in Obsolete, thread has been deprecated?


In my application, I am performing my file reading by another thread(other than the GUI thread). There are two buttons that suspend and resume the Thread respectively.

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

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

but I am facing this warning,

Thread.Suspend has been deprecated. Please use other classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore, to synchronize Threads or protect resources. http://go.microsoft.com/fwlink/?linkid=14202

Anyhow, I run only a single thread (rather than a GUI thread), so How can I apply Synchronization here or monitor.

Update Code:

class ThreadClass 
{

    // This delegate enables asynchronous calls for setting the text property on a rich text box 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;
            }
        }
    }

}

the run is bool value, a thread controls it(Initially it's true)

and to start a thread I am creating this class instance(this start thread also) in another class


Solution

  •  //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();
    

    Note that all operations are completed before the thread is "suspended"

    What you want

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