C#多线程操作控件问题

2025-04-27 08:39:53
推荐回答(4个)
回答1:

一楼的答案不仅不是正解,而且还会报错!
正确的做法如下:

Thread th = new Thread(new ThreadStart(() =>
{
while (true)
{
Thread.Sleep(1000);//繁琐的操作,或者IO等待放在这个线程里面操作
this.Invoke(new Action(() =>
{//当需要操作界面元素时,需要用Invoke,注意这里面不能有繁琐的操作
this.Text = (i++).ToString();
//Thread.Sleep(1000);如果这么写,就会卡住主线程
}));
}
}));
th.IsBackground = true;//一定要标记为后台线程,这样这个线程才能在你的主线程停止后自动停止
th.Start();

总之一句话,繁琐的业务操作放在非主线程里面去执行,或者用BackgroundWorker去执行,当需要操作界面元素时用Invoke,但是在Invoke里面不能有繁琐的业务操作

回答2:

invoke 会阻塞主线程(即ui线程)
调用invoke 直到执行完毕 才返回ui线程继续执行

如果不需要等待 请用BeginInvoke (异步执行)

回答3:

一楼正解 你是写在GuidProc这个类里面的,这个是不行的.必须写在Form的类中这是线程安全的问题啊,C#中默认不允许在控件的非创建线程中设置控件的值。,

回答4:

我是用多线程控制的,其实你也可以用定时器来做,一个效果。
public partial class Form2 : Form
{
int i = 0;
public Form2()
{
InitializeComponent();
this.Text = "Hello";
Thread th = new Thread(ChangeName);
th.Start();
}

public void ChangeName()
{
while (true)
{
this.Text = (i++) + "";
Thread.Sleep(1);
}
}
}