2016-04-25 15 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を呼び出します。

関連する問題