C# 线程更新GUI在随机时刻冻结
我有带按钮和文本框的表单。按钮是正在更新文本框值的起始线程C# 线程更新GUI在随机时刻冻结,c#,multithreading,winforms,C#,Multithreading,Winforms,我有带按钮和文本框的表单。按钮是正在更新文本框值的起始线程 public Form1() { InitializeComponent(); myDelegate = new UpdateUi(updateUi); } private void button1_Click(object sender, EventArgs e) { myThread = new Thread(new ThreadStart(Th
public Form1()
{
InitializeComponent();
myDelegate = new UpdateUi(updateUi);
}
private void button1_Click(object sender, EventArgs e)
{
myThread = new Thread(new ThreadStart(ThreadFunction));
myThread.Start();
}
private void ThreadFunction()
{
MyThreadClass myThreadClassObject = new MyThreadClass(this);
myThreadClassObject.Run();
}
private void updateUi(int i)
{
textBox1.Text = i.ToString();
Thread.Sleep(1000);
}
public Thread myThread;
public delegate void UpdateUi(int i);
public UpdateUi myDelegate;
和ThreadClass:
public class MyThreadClass
{
Form1 myFormControl1;
public MyThreadClass(Form1 myForm)
{
myFormControl1 = myForm;
}
public void Run()
{
// Execute the specified delegate on the thread that owns
// 'myFormControl1' control's underlying window handle.
for(int i=0;i<100;i++)
{
if(myFormControl1.InvokeRequired)
{
myFormControl1.Invoke(myFormControl1.myDelegate,i);
}
}
}
}
公共类MyThreadClass
{
Form1 myFormControl1;
公共MyThreadClass(Form1 myForm)
{
myFormControl1=myForm;
}
公开募捐
{
//在拥有代理的线程上执行指定的委托
//“myFormControl1”控件的基础窗口句柄。
对于(inti=0;i2->3->freeze->16->17等等)
我只做了一些修改就从中获取了代码,问题是您延迟了UI线程,而不是进程本身,所以发生的是您发出了所有更新命令,但由于它都在同一个线程上运行,因此会被阻塞,因为线程.Sleep
停止UI线程,因此它会运行一堆textBox1.Text=I.ToString()
然后它会在所有线程的所有时间停止。Sleep(1000);
您看到的1->2->3…的数量可能等于您机器中的内核数量
当你停止run方法时,会发生的事情是你发出一个立即运行的更新命令,并等待一秒钟,直到你发出下一个命令,我认为这就是你想要完成的。示例中的线程。Sleep
只会减慢它的速度。你不想这样,所以只需从代码中删除它。你这么说告诉我Thread.Sleep
是造成这种奇怪行为的原因吗?他需要它才能看到textBox1
@szpic中的数字:“将当前线程挂起指定的毫秒数。”如果UI线程处于睡眠状态,它将被冻结。睡眠应该在MyThreadClass.Run()的循环中
,而不是在updateUi()的UI上运行的代码中。