- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一个流链,执行压缩 -> 加密 -> 文件 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
在那里使用时,FileStream
的 BeginWrite
实现利用了提供更高可扩展性的“Windows 完成端口 API”。
从操作系统的角度来看,它不会是异步I/O。但是,它将在线程池线程上同步运行,有效地使其与所有其他代码异步。要真正利用操作系统异步 I/O,您需要在可以使用完成端口 API 的类上调用 BeginWrite
。
我不确定您使用的到底是什么压缩,所以对此持保留态度。例如,您正在使用的 Stream
可能甚至没有实现 BeginWrite
或者它可能同步实现它。
关于.net - 使用流链的异步 I/O (BeginWrite/BeginRead) 有什么影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1671952/
我很好奇在 BeginWrite 实际完成写入之前更改 byte[] 是否会影响 FileStream 最终写入的内容。 下面是这段代码,其中 currentPage 是一个字节[],其中包含我要写入
我正在我的 Unity3D 游戏中实现一个 TCP 客户端,我想知道在不等待上一个调用完成写入的情况下调用 NetworkStream.BeginWrite 是否真的安全。 根据我在阅读文档时的理解,
我有一个文件要填满,所以我想最好同时完成。 注意事项: 我同时从多台计算机获取文件。 我每次都在调用 StartWrite 之前设置位置。 -> 我是否必须在每次使用前锁定它? 它好用吗?你有更好的吗
我的 Sender 类有两个方法: public void SendMessage(OutgoingMessage msg) { try { stream.BeginW
假设我有一个流链,执行压缩 -> 加密 -> 文件 I/O。 在 C# 中,使用同步 I/O,它看起来像这样: int n=0; byte[] buffer= new byte[2048];
我有一个用 C# 编写的实用程序,用于与我们的 USB 设备来回通信。我们使用通用 HID 驱动程序并将设备句柄包装在 FileStream 对象中。我使用它的 BeginRead 和 BeginWr
我需要对同一文件进行一批写入,但在文件内的不同位置。我想以尽可能最好的性能实现这一目标,因此查看了同步 FileStream.Write 和异步 FileStream.BeginWrite 方法。 同
在Realm中有两种写事务的方式,它们有什么区别? 1. try! realm.write { ... } 2. realm.beginWrite() ... try! realm.commitW
异步向客户端写入数据时如何防止这个问题 The BeginWrite method cannot be called when another write operation is pending 我
我是一名优秀的程序员,十分优秀!