我写了一个程序,用AES加密文件。加密过程在文件流上完成。
- 加密方式:*
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);
}
我读到.NET中的AES实现实际上使用了Windows加密API。那么,我可以等待这些方法(特别是EncryptUsingAESAsync
方法),比如异步IO,还是应该在TaskFactoy.StartNew()
中显式调用它,以便在单独的线程上完成?还是有其他方法可以获得多线程的好处?
1条答案
按热度按时间fxnxkyjh1#
这取决于你的目标是什么,以及你所关注的环境。如果您受到磁盘IO的限制,您将看不到并行运行这些活动的任何好处。
就我个人而言,我会在类似的环境中获得一些典型的文件集,并使用一些实现对其进行基准测试,但我也会将
List<Task>.WhenAny
(或.WhenAll
)添加到您的潜在实现列表中进行检查。如果你需要一个快速的解决方案,我可能会走异步路线,因为这将由运行时管理(你已经构建了任务),如果它有环境开销来管理它,它将并行运行多个任务。我不确定
CryptoProvider.EncryptUsingAESAsync
是否是内部多线程的,这可能会增加更多的考虑因素。