首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时填充来自BeginRead的缓冲区?

何时填充来自BeginRead的缓冲区?
EN

Stack Overflow用户
提问于 2012-10-25 05:42:06
回答 1查看 766关注 0票数 2

我正在尝试编写一个TcpClient实现。我想在处理数据的同时开始下一次读取,但是我不确定传递给BeginRead的字节数组何时被修改。下面是我当前的实现

代码语言:javascript
复制
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调用吗?

代码语言:javascript
复制
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;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-25 06:09:26

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13058241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档