编程语言
首页 > 编程语言> > c# – 在异步代码中使用BinaryWriter或BinaryReader

c# – 在异步代码中使用BinaryWriter或BinaryReader

作者:互联网

我有一个要写入文件的float列表.下面的代码做了事情,但它是同步的.

List<float> samples = GetSamples();

using (FileStream stream = File.OpenWrite("somefile.bin"))
using (BinaryWriter binaryWriter = new BinaryWriter(stream, Encoding.Default, true))
{
    foreach (var sample in samples)
    {
        binaryWriter.Write(sample);
    }
}

我想异步执行操作,但BinaryWriter不支持异步操作,这是正常的,因为它每次只写几个字节.但大多数情况下,操作使用文件I / O,我认为它可以而且应该是异步的.

我尝试使用BinaryWriter写入MemoryStream,完成后我使用CopyToAsync将MemoryStream复制到FileStream,但是这会导致大文件的性能下降(总时间)高达100%.

如何将整个操作转换为异步?

解决方法:

正常的写操作通常最终会以异步方式完成.操作系统立即接受写入缓存中的写入,并在稍后将其刷新到磁盘.实际的磁盘写入不会阻止您的应用程序.

当然,如果您要写入可移动驱动器,则通常会禁用写入缓存,并且您的程序将被阻止.

我建议您一次传输一个大块,从而大大减少操作次数.以机智:

>分配所需块大小的新T [BlockSize].
>分配一个新字节[BlockSize * sizeof(T)]
>使用List< T> .CopyTo(index,buffer,0,buffer.Length)将批处理复制出列表.
>使用Buffer.BlockCopy将数据输入byte [].
>只需一次操作即可将byte []写入流中.
>重复3-5,直到到达列表末尾.小心最后一批,这可能是一个部分块.

标签:c,async-await,binarywriter,binaryreader
来源: https://codeday.me/bug/20190516/1116029.html