C# 暂停并恢复线程活动

C# 暂停并恢复线程活动,c#,multithreading,winforms,C#,Multithreading,Winforms,我有一个线程,它在某个时间间隔将点添加到zedgraph组件上。我需要在按下复选框时暂停添加点,然后在再次按下复选框时继续添加点。以下是我对线程的了解: public class myThread{ ManualResetEvent pauseResumeThread = new ManualResetEvent(true); public void threadHeartrateGraph() {

我有一个线程,它在某个时间间隔将点添加到zedgraph组件上。我需要在按下复选框时暂停添加点,然后在再次按下复选框时继续添加点。以下是我对线程的了解:

public class myThread{

     ManualResetEvent pauseResumeThread = new ManualResetEvent(true);

     public void threadHeartrateGraph()
            {                                                           
                    for (int k = 15; k < _hr.Length; k++)
                    {
                        pauseResumeThread.WaitOne();
                        if (HRDataSummary.threadPause == true)
                        {
                            break;
                        }
                        x = k;
                        y = _hr[k];
                        list1.Add(x, y);
                    _displayHRGraph.Invoke(list1, graph_HeartRate, _GraphName[0]);
                    graph_HeartRate.XAxis.Scale.Min = k-14;
                    graph_HeartRate.XAxis.Scale.Max = k+1;                        
                    Thread.Sleep(_interval * 1000);
                }  
            }
            catch (NullReferenceException)
            {

            }
        }
    public void play()
    {
        pauseResumeThread.Set();
    }
    public void pause()
    {
        pauseResumeThread.Reset();
    }
}

我错过了什么?或者使用ManualResetEvent是完全错误的吗?

首先,您全局声明您的
myThread
对象(只有一个!)

然后,您希望在新线程中启动Worker方法

Thread worker = new Thread(heartGraph.threadHeartrateGraph);
worker.Start();
现在,您可以使用ManualResetEvent暂停/恢复工作

if (checkBoxPause.Checked == true) {
    //HRDataSummary.threadPause = true;
    checkBoxPause.Text = "Play >";
    heartGraph.pause();
} else { 
    //HRDataSummary.threadPause = false;
    checkBoxPause.Text = "Pause ||";
    heartGraph.play();
}

为什么要在每个if语句中创建一个新的myThread对象?下面的链接演示了问题的答案。[单击此处()@Anto这是他已经拥有的,但是他的复选框代码完全关闭。只需直接调用pauseplay,无需为其设置线程。(1)if(checkBoxPause.Checked==true)=>if(checkBoxPause.Checked)`和if(checkBoxPause.Checked==false)=>if(!checkBoxPause.Checked)或者更好的方法是
否则
(2)
捕获
没有关联的
尝试
Thread worker = new Thread(heartGraph.threadHeartrateGraph);
worker.Start();
if (checkBoxPause.Checked == true) {
    //HRDataSummary.threadPause = true;
    checkBoxPause.Text = "Play >";
    heartGraph.pause();
} else { 
    //HRDataSummary.threadPause = false;
    checkBoxPause.Text = "Pause ||";
    heartGraph.play();
}