我們可能在程序里經常會使用到進度條這樣的東西,本人是個菜鳥,第一次寫這種東西的時候思路是這樣的,不多說上代碼
這是界面
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了,再拿出來和大家分享