【发布时间】:2014-08-25 17:14:12
【问题描述】:
我正在使用dispatcherTimer 来更新进度条的值:
DispatcherTimer tim = new DispatcherTimer();
tim.Interval = TimeSpan.FromMilliseconds(100);
tim.Tick += delegate
{
if (valuee < max)
{
prog.Value = valuee;
}
else
{
tim.Stop();
}
};
并像这样设置progressBar的最大值:
using (FileStream fs = File.Open(Filename, FileMode.Open))
{
if (fs.Length > 10485760 && fs.Length <= 209715200)
prog.Maximum = fs.Length / 1024;
else if (fs.Length <= 10485760)
prog.Maximum = fs.Length / 16;
else if(fs.Length > 209715200)
prog.Maximum = fs.Length / 1048576;
}
然后在for循环的每次迭代后增加值:
var Input = File.OpenRead(path);
int Size = MainWindow.prog.Maximum;
for (long i = 0; i < Input.Length; i += Size)
{
MainWindow.valuee++;
PasswordEnter.valuee++;
byte[] chunkData = new byte[chunkSize];
int bytesRead = 0;
while ((bytesRead = fsInput.Read(chunkData, 0, chunkSize)) > 0)
{
if (bytesRead != chunkSize)
{
for (int x = bytesRead - 1; x < chunkSize; x++)
{
chunkData[x] = 0;
}
}
cryptoStream.Write(chunkData, 0, bytesRead);
}
}
编辑:这就是我调用 AESCryptography 类的方式:
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += (obj, l) => lo.Encrypt(Filename, password.Password, "main");
worker.RunWorkerAsync();
但由于某种原因,progressBar 直到超过一半的迭代结束才更新!怎么了?
【问题讨论】:
-
什么代码在哪个线程上运行?
for循环中还会发生什么? -
block #3 在另一个线程上
-
您是否有理由避免在
BackgroundWorker线程上使用ReportProgress/ProgressChanged机制?更新进度条和状态显示对我来说效果很好。您的循环代码打开一个文件,然后在for循环内递增进度(valuee)。while循环似乎读取到文件结尾。然后for循环继续让while确保它仍然处于EOF,因为没有打开新文件。 (我假设Input和fsInput应该是同一个变量。) -
@HABO 发表您的评论作为答案,以便我接受!
标签: c# .net wpf progress-bar dispatchertimer