2017-04-20 69 views
-1

我試着去解密文件的進展報告,以顯示它在一個進度條,這是我能解密功能報告進度

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(); 
     } 

我想調用一個方法來報告內循環進度,但取決於方法的響應時間,這可能會降低解密器的性能,如何在沒有此問題的情況下報告進度? 謝謝!

+0

你解密在後臺線程?你如何報告進度?顯示該代碼。 – msitt

回答

0

一種你一些建議:

  1. 在您的報告方法,把它作爲檢查它有多長,因爲它最後一次報道。如果它小於0.3s,它會在沒有做任何事情的情況下返回 - 沒有進度條需要每秒更新超過3次。

和/或

  • 卸載報告方法到另一個線程的工作 - 這樣的循環中的方法將立即返回(你的循環可以繼續向右走)。在另一個線程的方法中,如果前一個報告線程還沒有完成,請包含一個檢查,以便不啓動另一個線程(即只是返回而不執行任何操作)。
  • 或者簡單一些,這很可能在你的情況下工作,包括通過你的循環在你的循環計數,然後每ñ時間,做你的進度報告和ñ值重置爲零。通過實驗選擇ň值,以便更新往往不夠(一對夫婦次每秒),但你沒有做更多的比你有進步更新。例如如果您的循環以每秒3000次的速度迭代,則每1000次更新一次就可以了。

    +0

    所以我可以創建一個線程與報告方法,並啓動它只有當它死了。謝謝! – Lolrapa