gpt4 book ai didi

.net - 使用流链的异步 I/O (BeginWrite/BeginRead) 有什么影响?

转载 作者:行者123 更新时间:2023-12-02 02:36:08 28 4
gpt4 key购买 nike

假设我有一个流链,执行压缩 -> 加密 -> 文件 I/O。

在 C# 中,使用同步 I/O,它看起来像这样:

  int n=0;
byte[] buffer= new byte[2048];
string inputFileName = "input.txt";
string outputFileName = inputFileName + ".compressed.encrypted";
using (FileStream inputFileStream = File.Open(inputFileName, FileMode.Open, FileAccess.Read))
{
using (FileStream outputFileStream = File.Open(outputFileName, FileMode.Create, FileAccess.ReadWrite))
{
using (Stream encryptor = new EncryptingStream(fs))
{
using (Stream compressor = new CompressorStream(encryptor))
{
while ((n = inputFileStream.Read(buffer, 0, buffer.Length)) > 0)
{
compressor.Write(buffer, 0, n);
}
}
}
}
}

要利用 FileStream 提供的异步 I/O,我想我不能简单地在压缩器流上使用 BeginWrite() 方法。

在此示例中,为了利用 FileStream 上的异步 I/O,我认为 EncryptingStream 需要通过在包装的 Stream 上调用 BeginWrite/EndWrite 来实现 Write。如果包装的 Stream 是 FileStream,那么我将获得异步 I/O。对吗?

最佳答案

在外部流(此处为 compressor)上调用 BeginWrite 将成功地将工作移至线程池,从而使其相对于调用方法异步执行.这可能对您的应用程序来说已经足够了,但这不是最大可能的效率。正如您所指出的,BeginWrite 不会用于实际执行磁盘 I/O 的内部 FileStream。当 BeginWrite 在那里使用时,FileStreamBeginWrite 实现利用了提供更高可扩展性的“Windows 完成端口 API”。

从操作系统的角度来看,它不会是异步I/O。但是,它将在线程池线程上同步运行,有效地使其与所有其他代码异步。要真正利用操作系统异步 I/O,您需要在可以使用完成端口 API 的类上调用 BeginWrite

我不确定您使用的到底是什么压缩,所以对此持保留态度。例如,您正在使用的 Stream 可能甚至没有实现 BeginWrite 或者它可能同步实现它。

关于.net - 使用流链的异步 I/O (BeginWrite/BeginRead) 有什么影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1671952/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com