上次关于线程的问题还未解决,又要问线程的问题了。
这段代码,t1和t2作为两个线程运行的时候,控件Label显示是没有问题的;
但不进行双线程运行,单单运行主线程的时候,控件Label(lbl1)却不能正常显示运行结果。
到底是怎么回事呢?唉,好头痛!
谢谢!
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;namespace test
{
public partial class Form1 : Form
{
Thread t1, t2;
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
} //这是单线程(主线程)运行
private void btnStart_Click(object sender, EventArgs e)
{
for (int i = 0; i < 200; i++)
{
lbl1.Text = i.ToString();
Thread.Sleep(50);
}
} //下面是双线程运行
private void btnStartTwo_Click(object sender, EventArgs e)
{
t1 = new Thread(new ThreadStart(runLbl1));
t2 = new Thread(new ThreadStart(runLbl2));
t1.Start();
t2.Start();
} private void runLbl1()
{
for (int i = 0; i < 100; i++)
{
lbl1.Text = i.ToString();
Thread.Sleep(50);
}
} private void runLbl2()
{
for (int i = 100; i > 0; i--)
{
lbl2.Text = i.ToString();
Thread.Sleep(50);
}
}
}
}

解决方案 »

  1.   

                    lbl1.Text = i.ToString();
                    lbl1.Update();
                    Thread.Sleep(50);
     修改Label的Text属性之后如果不执行Update则要等到线程接到消息时才会刷新,因为你的程序一直没有返回,所以没有刷新的机会。
      

  2.   

    我运行了下,你的程序好像没有问题嘛
    单线程:第一个label最后显示199
    双线程:第一个label显示99,第二个label显示1
      

  3.   

    不过如果你说的是单线程那一段没有实时显示运行结果的话,这个是因为你占用了主线程来运行btnStart_Click(object,EventArgs),导致主线程没有办法刷新界面(一个线程只能做一件事情啊)
    正确的做法是,主界面只负责界面,业务逻辑的计算放在子线程里面
      

  4.   

    多线程是因为你在其它线程里面更改Text,主线程一直在处理窗口消息,所以可以不断刷新;而单线程时主线程一直在执行你的循环,没有机会处理窗口消息。
      

  5.   

    非常非常感谢上面各位高手的指教。本菜鸟学习C#和WinForm两个月了,其实也经常要更改Label和TextBox的值,但从来都没有遇到这种情况。已经困惑了我两天了,改了很多次都不行,甚至改成下面的代码,都只能显示最后那一行的结果。
    txt1.Text = (++i).ToString();
    Thread.Sleep(500);
    lbl1.Text = 3.ToString();
    Thread.Sleep(500);
    lbl1.Text = "A";
    Thread.Sleep(500);
    txt1.Text = "B";
    Thread.Sleep(500);今天看到各位的答复,才知道是什么回事。我还特意用JAVA2005试了一次,也是这个样子。但用update更新不了,不知道是不是我没有用对参数。
    谢谢各位。派分结贴。