一、前言
VS中,如果UI背后的处理工作复杂,可以启用多线程进行处理,用户不喜欢反应慢的程序。在执行耗时较长的操作时,使用多线程是明智之举,它可以提高程序 UI 的响应速度,使得一切运行显得更为快速。那么如果在UI上反应最新的处理状态呢?这就是如果在子线程(即新开启的处理复杂任务的线程)中更新UI处理状态信息。
二、本节介绍最简单的方法。
在主线程中,定义一个子线程处理的对象,通过主线程启动子线程。然后通过主线程,不断的获取最新的处理状态。当然,也可以定义一个全局变量,子线程不断更新该全局变量,而主线程定时去获取状态信息。
主线程不断获取子线程的处理状态,可以通过定时器来完成。
注意,子线程没有去操作UI(主线程)的任何元素。
这种方法是一种偷换概念的方法。
public partial class Form1 : Form //UI线程
{
public subThread subPro = null;
public Form1()
{
InitializeComponent();
}
private void 启动子线程_Click(object sender, EventArgs e) //启动子线程
{
subPro = new subThread(); //注意,subPro是主线程类的一个变量
ThreadStart threadFunc = new ThreadStart(subPro.Process);
Thread thread1 = new Thread(threadFunc);
thread1.Start();
}
private void button1_Click(object sender, EventArgs e) //主线程可以定时不断的获取子线程状态,通过子线程对象
{
txtDisplay.Text = subPro.count.ToString();
thread1.Start(); //启动定时器
}
private void timer1_Tick(object sender, EventArgs e) //定时器不断更新UI上,反应子线程处理状态的信息
{
timer1.Interval = 1000;
this.txtDisplay.Text = subPro.count.ToString();
}
}
public class subThread // 子线程处理类
{
public int count = 0;
public void Process()
{
bool flag = true;
do
{
count++;
Thread.Sleep(1000);
if (count > 10000)
{
flag = false;
}
} while (flag);
}
}