Run a void after an async void has been completed

核能气质少年 提交于 2019-12-20 06:09:20

问题


I am encrypting a file asynchronously,and after that I want to run a void to do some logic on the encrypted file. I want the compiler wait until the file has been encrypted completely. So how can I wait for it to be completed? Have I to use "Task"? Thanks.

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");

    }

回答1:


You have no way of knowing when an async void method has completed. That's exactly why you should virtually never be using an async void method. The method should return a Task so that that Task can be used by the caller to determine when the method has finished, what the result(s) are (if applicable) and whether it was successful, cancelled, or faulted.



来源:https://stackoverflow.com/questions/36850857/run-a-void-after-an-async-void-has-been-completed

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!