正如标题所说,我正在尝试在我的网络项目中使用新的 (C# 8.0) 对象(Span)。在以前的实现中,我学到了在尝试使用其内容之前,必须确保 NetworkStream 已接收到完整的缓冲区,否则依赖于连接的状态,接收到的数据可能不完整。
while (true)
{
while (!stream.DataAvailable)
Thread.Sleep(10);
int received = 0;
byte[] response = new byte[consumerBufferSize];
//Loop that forces the stream to read all incoming data before using it
while (received < consumerBufferSize)
received += stream.Read(response, received, consumerBufferSize - received);
string[] message = ObjectWrapper.ConvertByteArrayToObject<string>(response);
consumerAction(this, message);
}
然而,现在引入了一种不同的读取网络流数据的方法(Read(Span))。并且假设 stackalloc 能够提高性能,我正在尝试将我的旧实现迁移到这种方法。现在它的样子如下:
while (true)
{
while (!stream.DataAvailable)
Thread.Sleep(10);
Span<byte> response = stackalloc byte[consumerBufferSize];
stream.Read(response);
string[] message = ObjectWrapper.ConvertByteArrayToObject<string>(response).Split('|');
consumerAction(this, message);
}
但是现在,既然它不提供我之前使用的方法,那么我如何确保缓冲区已经完全读取呢?
编辑:
//Former methodd
int Read (byte[] buffer, int offset, int size);
//The one I am looking for
int Read (Span<byte> buffer, int offset, int size);
Span<T>.Length
。 - aepotSpan
不是一个数组,它是数组的一个范围,已经包含了有关范围偏移量和长度的信息。请查看此构造函数。因此,您可以将其传递给 ctor 而不是Read
方法。 - aepot