2016-04-25 55 views
0

我正在異步加密文件,之後我想運行一個void來對加密文件執行一些邏輯。我希望編譯器等待文件完全加密。 那我該如何等待它完成?我有沒有使用「任務」? 謝謝。在異步void完成後運行void

public static async void AES_Encrypt(string path, string Password,Label lbl,ProgressBar prgBar) 
    { 
     byte[] encryptedBytes = null; 
     FileStream fsIn = new FileStream (path, FileMode.Open); 
     byte[] passwordBytes = Encoding.UTF8.GetBytes (Password); 
     byte[] saltBytes = new byte[] { 8, 2, 5, 4, 1, 7, 7, 1 }; 
     MemoryStream ms = new MemoryStream(); 
     RijndaelManaged AES = new RijndaelManaged(); 


       AES.KeySize = 256; 
       AES.BlockSize = 128; 

       var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000); 
       AES.Key = key.GetBytes(AES.KeySize/8); 
       AES.IV = key.GetBytes(AES.BlockSize/8); 

       AES.Mode = CipherMode.CBC; 
     CryptoStream cs = new CryptoStream (ms, AES.CreateEncryptor(), CryptoStreamMode.Write); 

     byte[] buffer = new byte[1048576]; 
     int read; 
     long totalBytes = 0; 

     while ((read = fsIn.Read (buffer, 0, buffer.Length)) > 0) { 

      totalBytes += read; 
      double p = Math.Round((double)totalBytes * 100.0/fsIn.Length,2,MidpointRounding.ToEven); 
      lbl.Text = p.ToString(); 
      prgBar.Value = (int)p; 
      Application.DoEvents(); 
      await cs.WriteAsync(buffer,0,read); 

     } 
      cs.Close(); 
     fsIn.Close(); 


       encryptedBytes = ms.ToArray(); 
     ms.Close(); 
     AES.Clear(); 
     string retFile = path + ".cte"; 
     File.WriteAllBytes (retFile, encryptedBytes); 
     Console.WriteLine ("ok"); 

    } 
+0

謝謝。我只是使用它們進行測試和調試,我將刪除它們。我是使用Streams的新手。 @HenkHolterman –

回答

2

您無法知道async void方法何時完成。這正是你幾乎從不使用async void方法的原因。該方法應該返回一個Task,以便調用者可以使用Task來確定方法何時完成,結果(如果適用)以及它是成功,取消還是出錯。

相關問題