最近做一个类似转移数据的程序,需要用到进度条,要求大概是这样的。
统计一段数据总量,显示在界面,共有10多段数据。开始转移数据,转移时进度条与转移的进度要一致,每转移成功一段数据,进度条就到尽头一次,直到10多段数据全部完成为止。
我现在遇到的问题是进度条还没走到尽头,就开始另一段数据转移了,感觉是程序比显示快了,看上去不那么和谐,所以我想进度条走到尽头之后,停留半秒,再开始另一段数据的转移。主要代码如下:
 
//这是线程循环里面
  private void dataMove(int i,int j)
        {
            if (this.InvokeRequired)
            {
                SetPos setpos = new SetPos(dataMove);
                this.Invoke(setpos, new object[] { i,j });
            }
            else
            {  progressBar1.Maximum = Convert.ToInt32(total); //设定进度条最大值为查询的记录数
                progressBar1.Step = Convert.ToInt32(Math.Ceiling(everycount / 5)); //进度条每次增加
                if (progress != Convert.ToDecimal(lblTotal.Text))
                {
                    progress += Convert.ToInt32(everycount);     //设置分段值
                }
                timer1.Start();
                thread.Suspend();   //挂起线程                //执行迁移
                if (!bsERP.BL.b_productProduceScan.SaveData(trans, Convert.ToInt32(everycount), j))//如果返回false,则记录其条数
                {
                    MessageBox.Show(lblTableName.Text +"迁移失败!","系统提示");
                    trans.Rollback();
                    return;
                }
            }
        }
//计时设置进度条前进
        private void timer1_Tick(object sender, EventArgs e)
        {
            if (progressBar1.Value < progress)      //如果进度条的值未达到分段值
            {
                if ((progressBar1.Value + progressBar1.Step) < progressBar1.Maximum)
                {
                    progressBar1.Value += progressBar1.Step;   //进度条增加设定的Step
                    lblPercent.Text = (Convert.ToDecimal(progressBar1.Value) / Convert.ToDecimal(lblTotal.Text) * 100).ToString("0.00");    //当前百分比
                    lblCurrent.Text = progressBar1.Value.ToString();
                }
                else
                {
                    progressBar1.Value = progressBar1.Maximum;
                    lblPercent.Text = (100).ToString();
                }
            }
            else
            {
                if (thread.ThreadState.ToString() != "Unstarted")
                {
                    thread.Resume();    //继续挂起的线程
                }
                timer1.Stop();
            }
        }