我有一个联网服务器,我切换到使用同步 Begin.. 来处理短暂的请求,这是一个巨大的改进。对于长期存在的线程,创建了两个线程,并且随着客户端数量的增加,它开始成为一个问题。
通过这些连接传输的数据是 4 到 40 字节的消息。但是,它们不是长度分隔的,它们的长度可能取决于消息中的部分。可悲的是我不能改变协议。您可以将该协议视为一种快节奏的 telnet 终端协议。
我正在研究使用 Stream.BeginRead 读取和解析传入的消息/“行”,并遇到了两个担忧:
- 对于 10 字节的消息,调用 BeginRead 大约 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 是和选项,所以我应该等待它然后进行异步编程吗?
这段代码将面向互联网,如果我使用同步读取,任何挂起的传入连接都会锁定线程池线程。