gpt4 book ai didi

c# - BeginRead 的缓冲区何时填充?

转载 作者:可可西里 更新时间:2023-11-01 02:42:59 24 4
gpt4 key购买 nike

我正在尝试写一个 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 在我处理时开始获取下一个数据 block 。我可以仅使用一个 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;
}
}

最佳答案

通常无法保证何时使用传递给 BeginRead 的缓冲区。理论上它甚至可以在 BeginRead 调用期间同步填充。

旁注:您应该编写始终正确运行的代码,因为推理比猜测特定实现的特定行为要容易得多。在这种情况下,只需复制数据或使用多个缓冲区,这样您就永远不会有未完成的 IO 和处理共享同一个缓冲区。

关于c# - BeginRead 的缓冲区何时填充?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13058241/

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