我们可能在程序里经常会使用到进度条这样的东西,本人是个菜鸟,第一次写这种东西的时候思路是这样的,不多说上代码
这是界面
private void button1_Click(object sender, EventArgs e) { for (int i = 0; i<100;i++ ) { Thread.Sleep(1000);//此处停一秒 this.progressBar1.Value = i; this.label1.Text = i.ToString(); } }
不出意外的话应该就卡死了,这就是所谓的卡UI,然后本人就在想是不是因为刷新(不知道怎么表达,但好像就是这种感觉),于是本菜鸟给Form1加了一个timer
并把代码改成这样子:
private void button1_Click(object sender, EventArgs e) { timer1.Interval = 100; timer1.Start(); timer1.Tick += timer1_Tick; } int value = 0; void timer1_Tick(object sender, EventArgs e) { if(value==101) { timer1.Stop(); MessageBox.Show("完成"); return; } this.progressBar1.Value = value; this.label1.Text = value.ToString()+"%"; value++; }
但是总感觉怪怪的,然后上网查了下,知道了线程
然后一般正确的使用姿势:
delegate void MyDel(int v); private void button1_Click(object sender, EventArgs e) { Thread thread = new Thread(new ThreadStart(Test));//实例化一个线程 thread.Start();//开启线程 } private void Test() { MyDel mydel = ChangeUI; for (int i = 0; i < 100; i++) { Thread.Sleep(100);//此处阻塞100毫秒 this.Invoke(mydel,i); } } private void ChangeUI(int value) { this.progressBar1.Value = value; this.label1.Text = value + "%"; }
不知Invoke用法的请移步我另一个随笔: http://www.cnblogs.com/shitong/p/5763775.html
这是没有参数的线程,线程还有一个可以传参数的如下:
private void button1_Click(object sender, EventArgs e) { ParameterizedThreadStart pts = new ParameterizedThreadStart(Test1); ThreadStart ts = new ThreadStart(Test);//线程调用的方法 Thread thread = new Thread(ts);//实例化一个线程 Thread thread2 = new Thread(pts); thread.Start();//开启线程 thread2.Start("object类型的参数"); } public void Test1(object obj) { string s = (string)obj; }
好啦,由于本菜鸟很菜,就写到这了,以后等本菜鸟玩的比较6了,再拿出来和大家分享