这是一个复制文件显示进度的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少才能完成,请高手指点
{
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少才能完成,请高手指点
对于100M的文件:
100 * 1024 * 1024 = 104857600 bytes.
需要读
104857600 / 4096 = 25600 次 , 一次Sleep 1ms, 大约25s,加上系统开销,大概就是楼主说的结果。
Application.DoEvents();试试
{
progressBar1.Value += e.ProgressPercentage;
application.DoEvents();
}
copy的时候不要sleep。