我想做一个进度条,实时显示进度,自己做的只有在结束时进度条立刻变满,执行时还是假死状态,下面代码的作用是将表A的内容复制到表B中,窗体只有一个,进度条控件就放在主窗体上using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OracleClient;
using System.Data.OleDb;
using System.IO;
using System.Threading;namespace WindowsFormsApplication5
{
    public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
        }
       
        private void SleepT()        //关于进度条的代码都是网上的,大家帮我看看怎么改
        {
            for (int i = 0; i < 500; i++)
            {
                System.Threading.Thread.Sleep(100);//没什么意思,单纯的执行延时
                SetTextMessage(100 * i / 500);
            }
        }        private delegate void SetPos(int ipos);
        private void SetTextMessage(int ipos) 
        {
            if (this.InvokeRequired)
            {
                SetPos setpos = new SetPos(SetTextMessage);
                this.Invoke(setpos, new object[] { ipos });
            }
            else 
            {
                //this.progress.Text = ipos.ToString() + "/100";
                this.progressBar1.Value = Convert.ToInt32(ipos);
            }
        }        private void btnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }        private void btnOK_Click(object sender, EventArgs e)
        {
            Thread fThread = new Thread(new ThreadStart(SleepT));//开辟一个新的线程
            fThread.Start();
            
            
            string souConStr = "Data Source=" + txtSouDB.Text + ";User ID=" + txtSouUser.Text + ";Password=" + txtSouPwd.Text + ";";
            string tarConStr = "Data Source=" + txtTarDB.Text + ";User ID=" + txtTarUser.Text + ";Password=" + txtTarPwd.Text + ";";
            if (txtSouTbl.Text.Trim() == "" )
            {
                CommFun.ShowError("不能为空", "复制");
                return;
            }
            DBOracle dboraCons = new DBOracle(souConStr);
            DBOracle dboraSDE = new DBOracle(tarConStr);
            if (dboraCons.Conn == null)
            {
                CommFun.ShowError("无法连接源数据库", "警告");
                return;
            }
            else if(dboraSDE.Conn==null)
            {
                CommFun.ShowError("无法连接目标数据库", "警告");
                return;
            }
            try
            {
                string sqlstr = string.Format("select * from {0}", txtSouTbl.Text);  //获取表A的数据
                OracleCommand cmd = new OracleCommand(sqlstr, dboraCons.Conn);
                OracleDataReader reader = cmd.ExecuteReader();                sqlstr = string.Format("select * from {0}", txtTarTbl.Text);
                OracleDataAdapter adpter = new OracleDataAdapter(sqlstr, dboraSDE.Conn);
                OracleCommandBuilder cmdBuilder = new OracleCommandBuilder(adpter);
                DataSet ds = new DataSet();
                adpter.Fill(ds);
                DataTable dt = ds.Tables[0];
                int oid = 0,count = 0;
                while (reader.Read())
                {                 
                    DataRow dr = dt.NewRow();                    
                    foreach (DataColumn dc in dt.Columns)
                    {
                        if (dc.ColumnName.ToUpper() == "OBJECTID")
                        {
                            dr["OBJECTID"] = oid++;                            
                        }
                        else if (dc.DataType.FullName.ToUpper()=="SYSTEM.BYTE[]" && reader[dc.ColumnName]!=DBNull.Value)
                        {
                            //Byte[] image = (Byte[])reader[dc.ColumnName];   //存取图片,效率贼低囧
                            //dr[dc.ColumnName] = image;
                        }
                        else
                        {
                            dr[dc.ColumnName] = reader[dc.ColumnName];
                        }
                    }
                    dt.Rows.Add(dr);
                    count++;    //计数器每到一百update一次,不知道这样会快还是慢
                    if (count == 100)
                    {
                        adpter.Update(dt);
                        count = 0;
                    }
                }
                adpter.Update(dt);                
                reader.Close();
                cmd.Dispose();
            }
            finally
            {
                dboraCons.CloseDB();
                dboraSDE.CloseDB();
                MessageBox.Show("数据传输完成!");
            }
        }
    }
}

解决方案 »

  1.   

            private void SleepT()        //关于进度条的代码都是网上的,大家帮我看看怎么改
            {
                for (int i = 0; i < 500; i++)
                {
                    Application.DoEvents();                System.Threading.Thread.Sleep(100);//没什么意思,单纯的执行延时
                    SetTextMessage(100 * i / 500);
                }
            }
      

  2.   

    private void button2_Click(object sender, EventArgs e)
    {
        progressBar1.Value = 0;
        progressBar1.Maximum = 100;
        //假设个例子,模拟效果
        new Thread((ThreadStart)delegate
            {
                int i = 100;
                while (i-->0)
                {
                    Thread.Sleep(10);//暂停一下,要有个效果嘛。
                    //invoke同步ui线程更新ProgressBar
                    this.Invoke((EventHandler)delegate { progressBar1.Value++; });                        
                }
                Thread.Sleep(10);
                this.Invoke((EventHandler)delegate { MessageBox.Show("Demo run over"); });
            }).Start();
    }