我有一个联网服务器,我切换到使用同步Begin ..处理短期请求,这是一个巨大的改进。 对于长期存在的线程,创建了两个线程,随着客户端数量的增加,它开始成为一个问题。
通过这些连接传输的数据是4到40个字节的消息。 但是它们不是长度分隔的,它们的长度可以取决于它们消息中的部分。遗憾的是我无法改变协议。 您可以将协议视为快节奏的telnet终端协议。
我正在研究使用Stream.BeginRead读取和解析传入的消息/“行”,并且已经达到了两个担忧:
这是一个例子。虽然消息本身不是长度的前缀,但它的一些内容可能是。
同步方法(当前)
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是和选项,所以我应该等待它并进行异步编程吗?
此代码将面向互联网,如果我使用同步读取,任何挂起的传入连接都会锁定线程池线程。
答案 0 :(得分:0)
我完成了异步实现,结果是CPU负载比每个连接一个线程的设计高4倍。
正在解析的协议本身设计糟糕,并且尝试异步解析它无助于管理更多连接。