我有以下代码从Stream(在这种情况下,从命名管道)读取数据并进入字节数组:
// NPSS is an instance of NamedPipeServerStream
int BytesRead;
byte[] StreamBuffer = new byte[BUFFER_SIZE]; // size defined elsewhere (less than total possible message size, though)
MemoryStream MessageStream = new MemoryStream();
do
{
BytesRead = NPSS.Read(StreamBuffer, 0, StreamBuffer.Length);
MessageStream.Write(StreamBuffer, 0, BytesRead);
} while (!NPSS.IsMessageComplete);
byte[] Message = MessageStream.ToArray(); // final data
您能否看一看,让我知道它是否可以更有效或更整洁地完成?使用MemoryStream似乎有点混乱。谢谢!
从Jon Skeet's article无耻复制。
public static byte[] ReadFully (Stream stream)
{
byte[] buffer = new byte[32768];
using (MemoryStream ms = new MemoryStream())
{
while (true)
{
int read = stream.Read (buffer, 0, buffer.Length);
if (read <= 0)
return ms.ToArray();
ms.Write (buffer, 0, read);
}
}
}
int read = stream.Read (buffer, 0, buffer.Length);
如果没有可用数据,此行将永远阻塞。读取是一种阻塞函数,它将阻塞线程,直到读取至少一个字节为止,但是如果没有数据,它将永远阻塞。
看来您当前的解决方案还不错。如果您希望代码看起来更简洁,则可以考虑将其包装为扩展方法。