gpt4 book ai didi

c# - 使用 TextReader 读取字节

转载 作者:行者123 更新时间:2023-11-30 12:31:17 27 4
gpt4 key购买 nike

过去,我一直使用 BinaryReader 来读取几个字节,但最近,我得到了这个错误:

An error has occurred: Probable I/O race condition detected while copying memory. The I/O package is not thread safe by default. In multithreaded applications, a stream must be accessed in a thread-safe way, such as a thread-safe wrapper returned by TextReader's or TextWriter's Synchronized methods. This also applies to classes like StreamWriter and StreamReader.    at System.Buffer.InternalBlockCopy(Array src, Int32 srcOffset, Array dst, Int32 dstOffset, Int32 count)
at System.IO.FileStream.Read(Byte[] array, Int32 offset, Int32 count)
at System.IO.BinaryReader.FillBuffer(Int32 numBytes)
at System.IO.BinaryReader.ReadUInt16()

因此,我决定使用 TextReader 的 Synchronized 方法,如下所示:

public class SafeReader
{
private Stream m_Stream;
private TextReader m_TextReader;
public SafeReader(Stream stream)
{
m_TextReader = TextReader.Synchronized(new StreamReader(m_Stream = stream));
}
public Stream BaseStream
{
get { return m_Stream; }
}
public int ReadInt32()
{
// this doesn't even need to do anything (just has to read 4 bytes and it gets disposed of anyway);
ReadUInt16();
ReadUInt16();
return -1;
}
public short ReadInt16()
{
return (short)(this.ReadUInt16());
}
public ushort ReadUInt16()
{
return BitConverter.ToUInt16(new byte[] { (byte)(m_TextReader.Read() & 0xFF), (byte)(m_TextReader.Read() & 0xFF) }, 0);
//return (ushort)(((m_TextReader.Read() & 0xFF)) | ((m_TextReader.Read() & 0xFF) << 8));
}
}

但是,返回的值(它几乎以专有格式读取图像)是不正确的。 “图像”有轻微的蓝色色调,我感觉这可能是由于 TextReader 读取文本(并使用编码而不是读取字节值读取字符)造成的。 p>

是否有像 TextReader 的 Synchronized() 这样的“线程安全”方式来读取二进制文件?

最佳答案

您应该能够使用BinaryReader而不是TextReader。只需确保在访问它的线程(写入)上锁定数组即可。

Object locker = new Object;

lock (locker) {
//BinaryReader here
}

从其他线程使用相同的:

lock (locker) {
//read from array (read is thread-safe though)
}

如果正在进行写操作,另一个线程将等待直到对象被解锁。

如果不需要分块读取,也可以使用 File.ReadAllBytes

或者在 Textreader 中使用 ASCII 或 UTF8 编码。

关于c# - 使用 TextReader 读取字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13945601/

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