运行下面代码的时候,当Label开始运行的时候,其他控件如TextBox、一个停止线程的按钮和结束窗体的按钮,全部都会失效。请问是什么原因呢?怎么解决?
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 TT2
{
public partial class Form1 : Form
{
Thread t1;
int i, j; public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
} private void btnStartThread_Click(object sender, EventArgs e)
{
lbl1.Text = "线程运行开始";
lbl1.Update();
Thread.Sleep(1000);
//textThread();
t1 = new Thread(new ThreadStart(runt1));
t1.Start();
t1.Join();
if (i == j)
MessageBox.Show("线程1完成");
} void runt1()
{
for (i = j; i < j + 50; i++)
{
lbl2.Text = i.ToString();
lbl2.Update();
Thread.Sleep(150);
}
j = i;
} private void button2_Click(object sender, EventArgs e)
{
t1.Abort();
} private void btnExit_Click(object sender, EventArgs e)
{
Application.Exit();
}
}
}

解决方案 »

  1.   

    Control.CheckForIllegalCrossThreadCalls = false;
    你去提这句进行调试一下啦`````
    不建议自己屏蔽一些错误
      

  2.   

    楼上正解, 你也可以使用 BackgroundWorker来实现, ^_^
      

  3.   

    在子线程中修改主线程中控件属性本身就不好,不论那些控件是不是线程安全。而且你呼叫了Update,那会锁住整个界面部分以等待Label刷新完成。实际上多线程比你想象的麻烦多了,建议多看别人的代码。
      

  4.   

    加入以下的代码:private delegate void LabelHandler(string text)void ChangeLabelText(string text)
    {
      if(lbl2.InvokeRequired)
      {
        LabelHandler lh = ChangeLabelText;
        this.Invoke(lh,new object[]{text});
      }else
      {
        lbl2.Text = text;
        lbl.Update();
      }
    }然后再你的Run1 里, 删除 lbl2.Text = i.ToString(); lbl2.Update(); 直接调用 ChangeLabelText(i.ToString());