//描述:2个线程。线程1从1循环到10000,线程2从1循环到20000,结果分别在其下文本框中显示。
        //问题:当点击[线程1-开始]按钮时,textbox1显示,立刻点击[线程2-开始]按钮,不能同时在2个文本框内显示线程的内容,而是线程1完毕之后才显示线程2的结果,为什么不能同时显示?程序中加过“Invoke()”,请大牛们帮忙!    public Thread t1, t2;
        public Form1()
        {
            InitializeComponent();
        }
        delegate void SetTextCallback(string text,string ss);
        private void button1_Click(object sender, EventArgs e)
        {  //开始
            t1 = new Thread(new ThreadStart(fill_text1));
            t1.Start();
            this.txt_1_d1.Text = DateTime.Now.ToString("hh:mm:ss ms");  //记录开始时间
        }
        private void button4_Click(object sender, EventArgs e)
        {//暂停线程1
            if (t1.ThreadState == ThreadState.Running || t1.ThreadState==ThreadState.WaitSleepJoin) t1.Suspend();
            else if (t1.ThreadState == ThreadState.Suspended) t1.Resume();
        }
        private void button2_Click(object sender, EventArgs e)
        { //开始2
            t2 = new Thread(new ThreadStart(fill_text2));
            t2.Start();
            this.txt_2_d1.Text = DateTime.Now.ToString("hh:mm:ss ms"); //记录开始时间
        }
        private void button3_Click(object sender, EventArgs e)
        { //暂停线程2
            if (t2.ThreadState == ThreadState.Running || t2.ThreadState == ThreadState.WaitSleepJoin) t2.Suspend();
            else if (t2.ThreadState == ThreadState.Suspended) t2.Resume();
        }
        private void fill_text1()
        {
            for (int i = 0; i < 10000; i++)
            {
                if (this.textBox1.InvokeRequired)
                {
                    Invoke( new SetTextCallback(SetText), new object[] { i.ToString(), DateTime.Now.ToString("hh:mm:ss ms") });  //
                }
                else SetText(i.ToString(), DateTime.Now.ToString("hh:mm:ss ms"));
            }
        }
        private void SetText(string text,string datetimes)
        {
            this.textBox1.Text = text;    //记录当前值
            this.txt_1_d2.Text = datetimes;   //记录现在时间
        }
        private void fill_text2()
        {
            int i = 0;
            while (i <= 20000)
            {
                if (this.textBox2.InvokeRequired)
                {
                    Invoke(new SetTextCallback(SetText2), new object[] { i.ToString(), DateTime.Now.ToString("hh:mm:ss ms") });  //
                }
                else SetText2(i.ToString(), DateTime.Now.ToString("hh:mm:ss ms"));
                i++;
            }
        }
        private void SetText2(string text, string datetimes)
        {
            this.textBox2.Text = text;     //记录当前值
            this.txt_2_d2.Text = datetimes;   //记录现在时间
        } 问题补充:控件:
textBox1  线程1的结果
textBox2  线程2的结果
button1  线程1-开始
button2  线程2-开始
button3  线程2-暂停
button4  线程1-暂停
txt_1_d1 线程1的开始时间
txt_1_d2 线程1的结束时间
txt_2_d1 线程2的开始时间
txt_2_d2 线程2的结束时间
label1  Thread-1
label2  Thread-2

解决方案 »

  1.   

    我做过~~ 试试private void fill_text1()
            {
                for (int i = 0; i < 10000; i++)
                {
                      SetText(i.ToString(), DateTime.Now.ToString("hh:mm:ss ms"));
                      Thread.Sleep(100);
                }
            }
            private void SetText(string text,string datetimes)
            {
                if (this.InvokeRequired)
                {
                    this.Invoke(new SetTextCallback(SetText), new object[] {text,datetimes  });  //
                }
                else
                {                this.textBox1.Text = text;    //记录当前值
                    this.txt_1_d2.Text = datetimes;   //记录现在时间
                }
            }
            private void fill_text2()
            {
                int i = 0;
                while (i <= 20000)
                {
                     SetText2(i.ToString(), DateTime.Now.ToString("hh:mm:ss ms"));
                     Thread.Sleep(100);
                    i++;
                }
            }
            private void SetText2(string text, string datetimes)
            {
                if (this.InvokeRequired)
                {
                    this.Invoke(new SetTextCallback(SetText2), new object[] { text, datetimes });  //
                }
                else
                {
                    this.textBox2.Text = text;     //记录当前值
                    this.txt_2_d2.Text = datetimes;   //记录现在时间
                }
            }