【问题标题】:Run a void after an async void has been completed在异步 void 完成后运行 void
【发布时间】:2023-03-12 02:09:01
【问题描述】:

我正在异步加密一个文件,然后我想运行一个 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");

    }

【问题讨论】:

  • 谢谢。我只是将它们用于测试和调试,我将删除它们。我是使用 Streams 的新手。 @HenkHolterman

标签: c# asynchronous encryption task


【解决方案1】:

您无法知道async void 方法何时完成。这就是为什么您实际上不应该使用async void 方法的原因。该方法应该返回一个Task,以便调用者可以使用Task 来确定方法何时完成、结果是什么(如果适用)以及它是成功、取消还是失败。

【讨论】:

    猜你喜欢
    • 2015-08-08
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 2015-09-04
    相关资源
    最近更新 更多