多线程感想

主线程在执行的同时,创建了一个多线程操作窗口的控件。但是执行效果非常好。

首先要判断  this.InvokeRequired 是否需要,需要则调用invoke方法,不需要就直接执行。

private delegate void SetPos(int ipos, string vinfo);//委托-设置进度条
        private delegate void SetBtnStat(Button btn, bool isEnabled);//委托-设置控件是否可用

        //设置进度条方法-多线程
        private void SetMessageText(int ipos, string vinfo) {
            if (this.InvokeRequired) {
                //开始执行委托的方法
                SetPos setpos = new SetPos(SetMessageText);//委托的方法主体
                this.Invoke(setpos, new object[] { ipos, vinfo });//委托的参数录入
            }
            else {
                //非委托执行
                this.label1.Text = ipos.ToString() + "/"+"100";
                this.label5.Text = vinfo;
                this.progressBar1.Value = Convert.ToInt32(ipos);
            }
        }

        //设置控件是否可用-多线程
        private void SetButtonEnabled(Button btn, bool isEnabled) {
            if (this.InvokeRequired) {
                SetBtnStat setBtnstat = new SetBtnStat(SetButtonEnabled);
                this.Invoke(setBtnstat, new object[] { btn, isEnabled });
            }
            else {
                btn.Enabled = isEnabled;
            }
        }


        private void button1_Click(object sender, EventArgs e) {
            //创建线程开始执行
            Thread fThread = new Thread(new ThreadStart(SleepT));
            fThread.Start();
        }

        private void SleepT() {
            SetButtonEnabled(button1, false);
            DateTime dStartDate = this.dateTimePicker1.Value;
            DateTime dEndDate = this.dateTimePicker2.Value;
            string card_no = this.textBox1.Text;
            if (string.IsNullOrEmpty(card_no)) {
                ExcelProgram.sqlcon.Open();
                List<string> list = ExcelProgram.GetAllVip();
                for (int iprogress = 0; iprogress < list.Count; iprogress++) {
                    ExcelProgram.GetAllCardSaleflow(list[iprogress], dStartDate, dEndDate);
                    SetMessageText(100 * iprogress / list.Count, iprogress.ToString());
                }
                ExcelProgram.sqlcon.Close();
            }
            else {
                ExcelProgram.sqlcon.Open();
                ExcelProgram.GetAllCardSaleflow(card_no, dStartDate, dEndDate);
                ExcelProgram.sqlcon.Close();
            }
            MessageBox.Show("操作成功");
            SetButtonEnabled(button1, true);
        }

 

posted @ 2016-02-20 15:13  昨天的小冉  阅读(114)  评论(0)    收藏  举报