ManualResetEvent通过信号量来控制线程

解决方案 »

  1.   

        public partial class Form1 : Form
        {
            Thread th1;
            public Form1()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
                if (th1 == null)
                {
                    th1 = new Thread(Thread1);
                    th1.IsBackground = true;
                    th1.Start();
                }
                else if ((th1.ThreadState & ThreadState.Suspended) == ThreadState.Suspended)
                {
                    th1.Resume();
                }        }        private void Thread1()
            {
                int i = 0;
                Action a = ()=>this.richTextBox1.Text = i.ToString();
                while (true)
                {
                    ++i;
                    Thread.Sleep(1000);
                    this.Invoke(a);
                }
            }        private void btnPause_Click(object sender, EventArgs e)
            {
                th1.Suspend();
            }
        }
      

  2.   

    Button1是开始btnPause是暂停,循环往richTextBox1打数字,就是利用suspend和resume方法。。不知道是不是你要的效果
      

  3.   

    而且所谓线程暂停,应该是暂停线程里面的代码逻辑
    而只有在while循环的时候才需要所谓的暂停,没有循环的话,线程一下就跑完了
    所以循环里面加个if就好了,如果是暂停状态,就执行sleep
      

  4.   

    谢谢@wmg494005678 你发的代码跟我想要的效果差不多  代码也很全面非常感谢你   
    @Z65443344 你发给 我的逻辑很清晰也很好也非常感谢你
      

  5.   


    protected Thread thTest = null;        protected void btnRunOrPause_Click(object sender, EventArgs e)
            {
                if (thTest == null)
                {
                    thTest = new Thread(new ThreadStart(RunOrPauseThread));
                    thTest.IsBackground = true;
                    thTest.Start();
                }
                else
                {
                    switch ((int)thTest.ThreadState)
                    {
                        case (int)ThreadState.Running:
                            thTest.Suspend();
                            break;
                        case (int)ThreadState.Suspended:
                            thTest.Resume();
                            break;
                        default: break;
                    }
                }
            }        protected void RunOrPauseThread()
            { 
                // do something
            }
      

  6.   

    线程的暂停,继续,看楼上的好像貌似 写的比我简单的多的啊
            BackgroundWorker bw = null;
            //创建ManualResetEvent
            ManualResetEvent mr = new ManualResetEvent(true);//启动背景线程
             private void button1_Click(object sender, EventArgs e)
            {
                CP_load.Visible = true;            bw = new BackgroundWorker();
                bw.WorkerSupportsCancellation = true;
                bw.WorkerReportsProgress = true;            bw.DoWork += new DoWorkEventHandler(bw_DoWork);
                bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
                bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);            bw.RunWorkerAsync();        }//暂停继续
       private void button3_Click(object sender, EventArgs e)
            {
                Button b = (Button)sender;
                if (b.Text == "暂停")
                {
                    mr.Reset();
                    b.Text = "继续";
                }
                else
                {
                    mr.Set();
                    b.Text = "暂停";
                }        }  //线程中执行事件,控制暂停继续的地方
      void bw_DoWork(object sender, DoWorkEventArgs e)
            {
                for (int i = 0; i <= 1000; i++)
                {
                    if (bw.CancellationPending)
                    {
                        e.Cancel = true;
                        return;
                    }
                    this.Invoke((MethodInvoker)delegate
                    {
                        this.richTextBox1.Text += i + Environment.NewLine;
                    });
     
                    bw.ReportProgress(i,i);                //接受指令
                    mr.WaitOne();
                }
            }
    //及时返回 百分比到UI上,更新UI。
          void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                
                CP_load.Value = (int)(((double)e.ProgressPercentage / (double)1000 * 100));
                CP_load.ProgressText = CP_load.Value.ToString();            if (CP_load.Value == 100)
                {
                    CP_load.Visible = false;
                }        }