1

所以我试图加密一些文件并且它工作正常,但是当我尝试包含一个进度条来显示大文件的距离时,比如一个 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 秒。

我能做些什么来改善这一点并使其更快?

4

1 回答 1

1

我的建议是不要使用秒表,而只是继续 # of bytes。也许检查每个字节后经过的秒表需要很长时间(虽然似乎不太可能,但谁知道)。此外,fsIn.Length在 while 循环之外获得一次。

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事件处理程序中的代码不是罪魁祸首。你不想在那里做任何昂贵的事情。

于 2016-04-23T02:07:15.137 回答