多线程感想

主线程在执行的同时,创建了一个多线程操作窗口的控件。但是执行效果非常好。
首先要判断 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); }

浙公网安备 33010602011771号