.NET中AES加密异步方法与多线程实现的疑问
问题
我编写了一个基于文件流的AES文件加密程序,实现了EncryptUsingAESAsync和EncryptFileStreamAsync两个异步方法(代码如下)。了解到.NET的AES实现会调用Windows加密API,现咨询三个问题:
- 能否像异步IO一样await这些方法?
- 是否需要通过
TaskFactory.StartNew()将其放到单独线程执行? - 有没有其他利用多线程的方式?
加密方法
public static async Task EncryptUsingAESAsync(FileStream fileReadStream, FileStream fileWriteStream, byte[] key, byte[] iv) { using(Aes aesAlg = Aes.Create()) { aesAlg.Key = key; aesAlg.IV = iv; ICryptoTransform encryptor = aesAlg.CreateEncryptor(); using(CryptoStream cryptoStream = new CryptoStream(fileWriteStream, encryptor, CryptoStreamMode.Write)) { await fileReadStream.CopyToAsync(cryptoStream); } } }
调用方法
public static async Task EncryptFileStreamAsync(string absolutePath, byte[] key, byte[] iv) { using(FileStream fReadStream = new FileStream(absolutePath, FileMode.Open, FileAccess.Read)) { using(FileStream fWriteStream = new FileStream($"{absolutePath}.EWW", FileMode.CreateNew, FileAccess.Write)) { await fWriteStream.WriteAsync(iv, 0, iv.Length); await CryptoProvider.EncryptUsingAESAsync(fReadStream, fWriteStream, key, iv); } } File.Delete(absolutePath); }
回答
完全可以直接await这些方法
你的代码已经正确使用await处理文件IO的异步操作,EncryptUsingAESAsync本身就是async Task类型的方法,天然支持await。虽然AES加密的核心运算(调用Windows加密API的部分)是同步CPU操作,但整个方法里的文件读写是异步的,await会在IO等待时释放当前线程,避免线程阻塞,这正是异步编程的优势所在。不需要用
TaskFactory.StartNew()放到单独线程TaskFactory.StartNew()会额外占用线程池线程来执行同步的加密运算,反而会浪费线程资源。你的方法已经通过异步IO实现了非阻塞,强行用StartNew会让线程池线程长时间处理CPU密集型任务,影响其他异步操作的调度效率。多线程优化的可行方式
- 如果要优化大文件加密速度,可以考虑文件分块并行加密:将大文件分割成多个独立块,用多线程并行处理每个块的加密,最后合并结果。但要注意AES的加密模式选择——比如CBC模式下块之间有依赖,不能直接并行,需要换成CTR等支持并行的模式,否则会破坏加密的正确性。
- .NET的
Aes类核心加密操作没有异步实现(因为Windows加密API的核心加密是同步的),所以无法直接通过异步方法并行加密,但可以用任务并行库(TPL)的Parallel.ForEach等API处理分块后的加密逻辑,不过要确保线程安全和加密模式适配。
内容的提问来源于stack exchange,提问作者Zombies are Real
相关产品推荐
相关产品推荐

