报告进度而不会减慢程序

时间:2017-04-20 13:59:03

标签: c# encryption

我试图解密报告进度的文件以在进度条中显示它,这是我的解密功能

private static void Decrypt(String inName, String outName, byte[] rijnKey, byte[] rijnIV)
        {
            FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read);
            FileStream fout = new FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write);
            fout.SetLength(0);


            byte[] bin = new byte[1048576];
            long rdlen = 0;
            long totlen = fin.Length;
            int len;

            SymmetricAlgorithm rijn = SymmetricAlgorithm.Create();         
            CryptoStream encStream = new CryptoStream(fout, rijn.CreateDecryptor(rijnKey, rijnIV), CryptoStreamMode.Write);


            while (rdlen < totlen)
            {
                len = fin.Read(bin, 0, bin.Length);
                encStream.Write(bin, 0, len);
                rdlen = rdlen + len;
                //Call here a method to report progress
            }


            encStream.Close();
            fout.Close();
            fin.Close();
        }

我想调用一个方法来报告循环内部的进度,但是根据方法的响应时间,这可能会降低解密器的性能,如何在没有此问题的情况下报告进度? 谢谢!

1 个答案:

答案 0 :(得分:0)

为您提出几点建议:

  1. 在您的报告方法中,检查自上次报告以来的时间。如果它小于,比如说0.3秒,那么它没有做任何事情就会返回 - 没有进度条需要每秒更新超过3次。
  2. 和/或

    1. 将报告方法的工作卸载到另一个线程上 - 这样循环中的方法将立即返回(您的循环可以立即继续)。在另一个线程的方法中,如果前一个报告线程尚未完成,请包括检查不启动另一个线程(即只是返回而不做任何事情)。
    2. 或者更简单,在您的情况下可能正常工作,在循环中包含一个计数器,然后在循环中每次 n 次,执行进度报告并重置 n的值为零。通过实验选择 n 的值,以便它经常更新(每秒几次),但是您没有进行比您更多的进度更新。例如如果你的循环每秒迭代3000次,那么每1000次更新一次就没问题了。