CryptoStream ReportProgress ProgressBar C#
CryptoStream ReportProgress ProgressBar C#
所以我正在尝试加密一些文件并且它工作正常,但是当我尝试包含一个进度条来显示大文件(如 100mb-1gb 文件)的进度时,性能大幅下降并且非常减缓。我假设它是因为 ReportProgress 被快速调用,所以我添加了一个秒表以每 2 秒更新一次,但这导致它工作得更快(如果不调用 reportProgress 仍然没有那么快)但有时也不会更新进度条完全没有。
using (FileStream fsCrypt = new FileStream(cryptFile, FileMode.Create))
{
using (CryptoStream cs = new CryptoStream(fsCrypt, AES.CreateEncryptor(), CryptoStreamMode.Write))
{
using (FileStream fsIn = new FileStream(inputFile, FileMode.Open))
{
int data;
int test = 0;
Stopwatch stopw = new Stopwatch();
stopw.Start();
while ((data = fsIn.ReadByte()) != -1)
{
cs.WriteByte((byte) data);
test++;
if (stopw.Elapsed.Seconds > 2)
{
stopw.Reset();
backgroundWorker1.ReportProgress((int) fsIn.Length);
}
}
stopw.Stop();
}
}
}
例如,删除 backgroundWorker1.ReportProgress((int) fsIn.Length);
行一个文件可能需要 5 秒,但添加它后,最终需要 20 秒。
我可以做些什么来改进它并使其更快?
我的建议是不要使用秒表,而是继续使用字节数。也许在每个字节之后检查秒表经过了很长时间(虽然似乎不太可能,但谁知道呢)。此外,在 while 循环之外获取 fsIn.Length
一次。
using (FileStream fsCrypt = new FileStream(cryptFile, FileMode.Create))
{
using (CryptoStream cs = new CryptoStream(fsCrypt, AES.CreateEncryptor(), CryptoStreamMode.Write))
{
using (FileStream fsIn = new FileStream(inputFile, FileMode.Open))
{
int data;
long test = 0;
long total = fsIn.Length;
while ((data = fsIn.ReadByte()) != -1)
{
cs.WriteByte((byte) data);
test++;
if (test % 10000 == 0)
{
backgroundWorker1.ReportProgress((int) (test * 100 / total));
}
}
}
}
}
还要确保 ReportProgress
事件处理程序中的代码不是罪魁祸首。你不想在那里做任何昂贵的事情。
所以我正在尝试加密一些文件并且它工作正常,但是当我尝试包含一个进度条来显示大文件(如 100mb-1gb 文件)的进度时,性能大幅下降并且非常减缓。我假设它是因为 ReportProgress 被快速调用,所以我添加了一个秒表以每 2 秒更新一次,但这导致它工作得更快(如果不调用 reportProgress 仍然没有那么快)但有时也不会更新进度条完全没有。
using (FileStream fsCrypt = new FileStream(cryptFile, FileMode.Create))
{
using (CryptoStream cs = new CryptoStream(fsCrypt, AES.CreateEncryptor(), CryptoStreamMode.Write))
{
using (FileStream fsIn = new FileStream(inputFile, FileMode.Open))
{
int data;
int test = 0;
Stopwatch stopw = new Stopwatch();
stopw.Start();
while ((data = fsIn.ReadByte()) != -1)
{
cs.WriteByte((byte) data);
test++;
if (stopw.Elapsed.Seconds > 2)
{
stopw.Reset();
backgroundWorker1.ReportProgress((int) fsIn.Length);
}
}
stopw.Stop();
}
}
}
例如,删除 backgroundWorker1.ReportProgress((int) fsIn.Length);
行一个文件可能需要 5 秒,但添加它后,最终需要 20 秒。
我可以做些什么来改进它并使其更快?
我的建议是不要使用秒表,而是继续使用字节数。也许在每个字节之后检查秒表经过了很长时间(虽然似乎不太可能,但谁知道呢)。此外,在 while 循环之外获取 fsIn.Length
一次。
using (FileStream fsCrypt = new FileStream(cryptFile, FileMode.Create))
{
using (CryptoStream cs = new CryptoStream(fsCrypt, AES.CreateEncryptor(), CryptoStreamMode.Write))
{
using (FileStream fsIn = new FileStream(inputFile, FileMode.Open))
{
int data;
long test = 0;
long total = fsIn.Length;
while ((data = fsIn.ReadByte()) != -1)
{
cs.WriteByte((byte) data);
test++;
if (test % 10000 == 0)
{
backgroundWorker1.ReportProgress((int) (test * 100 / total));
}
}
}
}
}
还要确保 ReportProgress
事件处理程序中的代码不是罪魁祸首。你不想在那里做任何昂贵的事情。