我正在尝试编写一个TcpClient实现。我想在处理数据的同时开始下一次读取,但是我不确定传递给BeginRead的字节数组何时被修改。下面是我当前的实现
private void ProcessData()
{
byte[] buffer = new byte[_tcpClient.ReceiveBufferSize];
var networkStream = _tcpClient.GetStream();
IAsyncResult result = networkStream.BeginRead(buffer, 0, buffer.Length, null, null);
int read;
while ((read = networkStream.EndRead(result)) != 0)
{
result = networkStream.BeginRead(buffer, 0, buffer.Length, null, null);
ProcessChunk(buffer, read);
}
}我在长时间运行的函数之前启动了下一个BeginRead,因为我希望后台IO在我处理时开始获取下一个数据块。我可以只用一个byte[]缓冲区就能做到这一点吗,或者我需要轮流使用每个BeginRead调用吗?
private void ProcessData()
{
bool bufferChoice = false;
byte[] bufferA = new byte[_tcpClient.ReceiveBufferSize];
byte[] bufferB = new byte[_tcpClient.ReceiveBufferSize];
var networkStream = _tcpClient.GetStream();
IAsyncResult result = networkStream.BeginRead(bufferA, 0, bufferA.Length, null, null);
int read;
while ((read = networkStream.EndRead(result)) != 0)
{
if (bufferChoice)
{
result = networkStream.BeginRead(bufferA, 0, bufferA.Length, null, null);
ProcessChunk(bufferB, read); //Call function with B's buffer
}
else
{
result = networkStream.BeginRead(bufferB, 0, bufferB.Length, null, null);
ProcessChunk(bufferA, read); //Call function with A's buffer
}
bufferChoice = !bufferChoice;
}
}发布于 2012-10-25 06:09:26
通常不能保证何时会使用传递给BeginRead的缓冲区。理论上,它甚至可以在BeginRead调用期间同步填充。
附注:您应该编写行为始终正确的代码,因为对特定实现的特定行为进行推理要比猜测容易得多。在这种情况下,只需复制数据或使用多个缓冲区,这样就不会有未完成的IO和进程共享同一个缓冲区。
https://stackoverflow.com/questions/13058241
复制相似问题