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

前端 未结 3 1418
忘掉有多难
忘掉有多难 2021-02-05 22:19

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



        
相关标签:
3条回答
  • 2021-02-05 22:38

    The reason Suspend and Resume are deprecated is because there are no guarantees at what point in the execution the thread will be suspended on. This is a bad thing. The issue is described here as well as a solution.

    The solution should involved a WaitHandle (maybe AutoResetEvent or ManualResetEvent) which you can use to signal to your autoReadThread to stop/start.

    0 讨论(0)
  • 2021-02-05 23:02

    I would use the Monitor mechanism for achieving pausing and resuming threads. The Monitor.Wait will cause the thread to wait for the 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);
        }
    }
    
    0 讨论(0)
  • 2021-02-05 23:05
     //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;
    }
    
    0 讨论(0)
提交回复
热议问题