这是一个复制文件显示进度的WIN FORM程序 代码如下public partial class Form1 : Form
    {
        bool ok = false;
        static object locker = new object();
        BackgroundWorker bw;
        byte[] buffs = new byte[4096];
        int readLine = 0;
        int fileLength = 0;
        FileStream fsInStream, fsOutStream;
        public Form1()
        {
           
           
            InitializeComponent();
        }        private void button1_Click(object sender, EventArgs e)
        {
            bw = new BackgroundWorker();            label1.Text = "Copying..." ;
            fsInStream = new FileStream("NVIDIA.rar", FileMode.Open, FileAccess.Read);
            fsOutStream = new FileStream("NVIDIB.rar", FileMode.Create, FileAccess.Write);
            fileLength = (int)fsInStream.Length;
            progressBar1.Maximum = fileLength;
            progressBar1.Value = 0;
            progressBar1.Visible = true;
            //aa a = new aa(copy);
            bw = new BackgroundWorker();
            bw.DoWork += copy;
            bw.RunWorkerCompleted += sok;
            bw.ProgressChanged += Progress_m;
            bw.RunWorkerAsync("dfdf");
        }        void copy(object sender, DoWorkEventArgs e)
        {
            bw.WorkerSupportsCancellation = true;
            bw.WorkerReportsProgress = true;
            while (true)
            {
               
                readLine = fsInStream.Read(buffs, 0, 4096);
                if (readLine != 0)
                {
                    fsOutStream.Write(buffs, 0, 4096);
                    bw.ReportProgress(readLine);
                    Thread.Sleep(1);
                }
                else
                {
                    fsInStream.Close();
                    fsOutStream.Close();
                    return;
                }
                
            }
            
           // label1.Invoke(
        }        void sok(object sender,  RunWorkerCompletedEventArgs e){
            label1.Text = "DONE...";
            //MessageBox.Show(progressBar1.Step.ToString());        }
        void Progress_m(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value += e.ProgressPercentage;
            
        }
    }假设复制的文件为100MB,如果我不加上Thread.Sleep(1);的情况下.进度条显示正常.但窗体会假死,(即拖不动了)但3-4秒完成.加上Thread.Sleep(1);后窗体不会假死,但任务30-40少才能完成,请高手指点

解决方案 »

  1.   

    这样的情况应该用一个新线程来执行复制操作。不应放到主线程中,这样会造成界面堵塞。
    对于100M的文件:
    100 * 1024 * 1024 = 104857600 bytes.
    需要读
    104857600  / 4096 = 25600 次 , 一次Sleep 1ms, 大约25s,加上系统开销,大概就是楼主说的结果。
      

  2.   

    Thread.Sleep(1); 不要,在 while 加
    Application.DoEvents();试试
      

  3.   

    void Progress_m(object sender, ProgressChangedEventArgs e) 
            { 
                progressBar1.Value += e.ProgressPercentage; 
                application.DoEvents(); 
            } 
    copy的时候不要sleep。
      

  4.   

    谢谢各位.我已经解决.我把SLEEP去掉了.就没事?原来我的buff设成2048的.窗口会托不会.后来我改成4098,多手想加个SLEEP想效果会好的.谁知到把去了再好.我汗啊