public partial class Form1 : Form
    {
        public bool flag = true;
        public Form1()
        {
            InitializeComponent();
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
        }        private void button1_Click(object sender, EventArgs e)
        {
            if (flag == true)
            {
                flag = false;
            }
            else
            {
                flag = true;
            }
        }        private void Form1_Load(object sender, EventArgs e)
        {
            Thread th = new Thread(s);
            th.Start();
        }
        private void s()
        {
            int i = 0;
            while (flag)
            {
                label1.Text = i.ToString();
                i++;
            }
        }        private void button2_Click(object sender, EventArgs e)
        {
            label1.Text = "abc";
        }
    }
在我点击button1的时候,label1上的数字停止了增长,但是我再次点击button1,数字却不继续增长了(label1不再更新了)。为什么呢?我想用线程解决一个问题,在线程调用的方法里面,有一个for,for里面有一系列的操作,我想要在点击某个按钮的时候,暂停这个线程,同时又保证for里面一个系列的操作都完成再暂停,请问有办法解决吗?用我上面那个办法可以吗?刚注册的csdn,分有些少,请见谅。

解决方案 »

  1.   

    flag为false的时候, while循环就结束了,这个线程也结束了有一个办法是在外面加个循环private void s()
            {
                int i = 0;
    while(true)
    {
                while (flag)
                {
                    label1.Text = i.ToString();
                    i++;
                }
    thread.sleep(50);
    }
            }
      

  2.   


    借用一句流行的火星语言体:凡是在线程中搞for循环并且外边搞什么暂停的,都是耍流氓!你可以在你的控制流程中,让线程结束,然后在创建新的线程。用不着搞什么“暂停”。线程编程最忌讳的就是什么胡乱“阻塞”的做法。阻塞会随随便便就造成系统严重的死锁问题(或者至少是非常“卡”的问题)。因此“从来不阻塞”,才是线程流程设计的诀窍。因此,如果你想所谓“暂停”它,那么就结束它,而不是暂停它。
      

  3.   


    简单点的话,暂停线程使用 suspend 和resume 方法,对于完成操作才结束线程,这个需要一个变量来控制,即给一个变量让线程内检测这个变量,一定值的时候在适当的部位结束所在线程。当然如果在暂停的时候结束这个线程则一定要先改变变量的值,然后继续线程,否则线程suspend在那里是不能检测变量的,而且有可能会多出几次循环。刚给你改了代码,结果不熟悉引用这个东西,引用了下,全没了,。
    复杂点就用线程池按照3L的过程做了。