相信对多线程有所了解的人都知道,子线程是不能直接操作winform上的控件的,因为默认的控件是在主线程上生成的,子线程是不能直接访问或者修改的,直接访问或者修改控件属性的话会报错。这个即使在Java上也是这样,Android中也经常被用到的。
这样的话,子线程岂不是没办法访问主线程生成的控件了,当然是否定的,有问题就用解决办法,微软的人更了解这一点,并且有好几种解决办法,主要的思路就是在子线程里,使用delegate代理一个主线程里面的方法。直接看代码:
private void showDateTimeMethod()
{
while (true)
{
//显示当前时间
label1.Text = "当前时间 " + DateTime.Now.ToString();
//线程暂停
Thread.Sleep(1000);
}
}
private void Form1_Load(object sender, EventArgs e)
{
//新建一个线程
Thread showDateTimethread = new Thread(new ThreadStart(showDateTimeMethod));
//该线程为后台线程
showDateTimethread.IsBackground = true;
//线程启动
showDateTimethread.Start();
}
这样写的话,毫无疑问会报错,就是咱们上面说到的情况,子线程直接操作ui元素。我们对这个进行改造一下:
//声明一个委托类型,该委托类型无输入参数和输出参数
public delegate void ProcessDelegate();
//函数引用,label控件