线程的简单使用之进度条

我们可能在程序里经常会使用到进度条这样的东西,本人是个菜鸟,第一次写这种东西的时候思路是这样的,不多说上代码

这是界面

        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了,再拿出来和大家分享

 

posted @ 2016-08-12 10:28  樱满集  阅读(2177)  评论(0编辑  收藏  举报