我正在用C#编写一个服务器,它创建一个(很长,甚至可能是无限)IEnumerable<Result>
以响应客户端请求,然后将这些结果传回给客户端。让客户端提取数据
我可以设置它,以便如果客户端读取速度很慢(或者一次完全可能几秒钟不读),服务器将不需要等待缓冲区空间的线程停止清除这样它可以拉动下一对Result
,将它们序列化,并将它们填充到网络中?
这是如何NetworkStream.BeginWrite
的作品?关于何时调用回调方法,文档不清楚(对我而言)。这是否基本上立即发生,只是在另一个线程,然后阻止EndWrite
等待实际的写作发生?当套接字API下溢中的某种较低级缓冲区发生时会发生吗?数据实际写入网络时会发生吗?它在被确认后会发生吗?
我很困惑,所以有可能整个问题都是离题的。如果是这样,你能转过来指点我正确的方向来解决我所期望的是一个相当普遍的问题吗?
这个问题中有一些信息不太准确。例如,正如我在我的文章中所解释的那样,只要数据到达发送缓冲区,回调并不总是被调用。这取决于实施,但即使在Windows上,也取决于IO完成端口是否可用。有时可能会立即调用它并阻止EndWrite。我还会补充说,为每一次发送创建一个线程是不明智的。至少,使用线程池。但是,这只是让事情变得复杂,而且最有可能的做法比BeginWrite的效率低。 – IRBMe 2009-07-12 09:08:28