0

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

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

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

  1. 对于 10 字节的消息,调用 BeginRead 大约 3 次是否有效?
  2. 我如何有效地编写代码来做到这一点

这是一个例子。虽然消息本身没有长度前缀,但它的某些内容可能是。

同步方式(当前)

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 是和选项,所以我应该等待它然后进行异步编程吗?

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

4

1 回答 1

0

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

被解析的协议本身设计得很糟糕,尝试异步解析它无助于管理更多的连接。

于 2012-08-02T17:00:50.433 回答