我写的程序在界面上有三个按钮,开始、暂停、停止
在点击开始按钮后开始一个线程,我想点击暂停后就使线程暂停,但是用Suspend()和Resume()提示已经过时,在网上搜了很多解答,都不好。很多用的是ManualResetEvent中的WaitOne()和Set(),但是它只能是在固定的一个点暂停下来,而不能在按下暂停按钮的时刻线程完成了多少就在完成出暂停。
请问怎么解决?
大概代码结构如下:public partial class L3
    {
        //新的的线程
        private Thread thread;        public L3()
        {
            //线程初始化
            thread = new Thread(new ThreadStart(ProcessSites));
        }        //点击开始按钮
        private void pictureBox_start_Click(object sender, EventArgs e)
        {
            if (是暂停状态)
                恢复执行;     //怎么写?
            else
                thread.Start();
        }        //点击暂停按钮
        private void pictureBox_pause_Click(object sender, EventArgs e)
        {
              //怎么写?
        }        //点击停止按钮
        private void pictureBox_stop_Click(object sender, EventArgs e)
        {
            thread.Abord();
        }
        //新线程调用的函数
        private void ProcessSites()
        {
            code...;
            code...;
        }
    }
}

解决方案 »

  1.   

    什么叫做“完成处暂停”?如果你说这不是WaitOne、Set,那么谁还知道你说的“完成处”是什么意思?
      

  2.   


    就是说比如一个thread调用的函数是Process
    ManualResetEvent mre = new ManualResetEvent(false);
    void Process()
    {
         code...;
         mre.WaitOne();
         code...;
         code...;
    }
    这样的话只会在执行完第二行代码后暂停。但是我想要的是:在点击暂停时,如果此时刚好执行完第一条代码,那就在第二条代码执行之前暂停;如果此时刚好执行完第二条代码,那就在第三条代码执行之前暂停。
      

  3.   

    用这种线程方法之所以过时,我觉得操作起来比较麻烦,面对你要求的logic,我想到的也只能是在ProcessSites的地方添加一个全局的消息变量,
    在pictureBox_pause_Click的时候判断这个全局变量的值,然后再thread.Suspend();
    所以不是很好,建议用线程池来改写.
      

  4.   

    网上很多人都在问suspend()和resume()过时了用什么代替,但是总是没有人给出好的解答。
    唉。
      

  5.   

    http://www.189works.com/article-96284-1.html
      

  6.   

    我就是用ManualResetEvent解决这个问题,虽然不能立刻暂停线程,但其实也差不多,用户没感觉,
      

  7.   

    哥们,你真想处处waitone呀!那你可以在每个语句上面,reset,waitone!嘿嘿!
      

  8.   

    你这个需求,只有Suspend()和Resume()能够实现,但是注意临界资源,死锁等问题!
    我最近也做了一个多线程的模块,我建议是,点击按钮后提示“正在暂停线程...”,等各个一个线程执行的函数完毕后,再提示“线程已经停止!”。这样才算是安全的暂停了线程!