异步解析非长度分隔数据

时间:2012-07-31 10:31:54

标签: c# .net asynchronous beginread

我有一个联网服务器,我切换到使用同步Begin ..处理短期请求,这是一个巨大的改进。 对于长期存在的线程,创建了两个线程,随着客户端数量的增加,它开始成为一个问题。

通过这些连接传输的数据是4到40个字节的消息。 但是它们不是长度分隔的,它们的长度可以取决于它们消息中的部分。遗憾的是我无法改变协议。 您可以将协议视为快节奏的telnet终端协议。

我正在研究使用Stream.BeginRead读取和解析传入的消息/“行”,并且已经达到了两个担忧:

  1. 为10字节的消息调用BeginRead大约3次是否有效?
  2. 如何有效地编写执行此操作的代码
  3. 这是一个例子。虽然消息本身不是长度的前缀,但它的一些内容可能是。

    同步方法(当前)

    int length = reader.ReadInt32();
    byte[] buffer = reader.ReadBytes(length);
    

    异步方法

        ...
        //Here we have received a byte array
        int length = ParseIntegerFromBuffer(buffer);
        stream.BeginRead(buffer, 0, length, Part1Read, null);
    }
    private void Part1Read(IAsyncResult result)
    {
        ...
    

    异步示例不是我正在使用的,我已经编写了一些包装器,负责检查所请求的字节数的成功读取。 这在编写和理解我可以得到的书面代码方面是否有效?

    我的代码必须在.NET 3.5上运行,但是将来5是和选项,所以我应该等待它并进行异步编程吗?

    此代码将面向互联网,如果我使用同步读取,任何挂起的传入连接都会锁定线程池线程。

1 个答案:

答案 0 :(得分:0)

我完成了异步实现,结果是CPU负载比每个连接一个线程的设计高4倍。

正在解析的协议本身设计糟糕,并且尝试异步解析它无助于管理更多连接。