我已经研究过了,我知道实现高性能套接字服务器的最佳方法通常如下:使用异步套接字操作(专门为获得最佳性能的SocketAsyncEventArgs/Operations),在异步回调上将请求推送到由线程池管理的处理队列中。
对于这个处理模型,我有以下问题,以获得最佳性能:
1)应该在什么时候调用套接字的“End”操作(例如EndAccept或EndReceive)?应该在回调线程(IOCP)中调用它,然后再将请求排队吗?还是在请求被取出队列并被处理(工作线程)时调用?
2)这个问题取决于第一题的答案。什么时候应该调用下一个“Begin”操作?我们应该在调用EndOperation之前甚至在调用EndOperation之后立即调用它(在排队/处理请求之前)?
3)处理队列可以简单地使用.NET线程池吗?使用.NET线程池与自己编写同步处理队列相比,有什么优势/缺点?
任何帮助都将不胜感激。
对于这个处理模型,我有以下问题,以获得最佳性能:
1)应该在什么时候调用套接字的“End”操作(例如EndAccept或EndReceive)?应该在回调线程(IOCP)中调用它,然后再将请求排队吗?还是在请求被取出队列并被处理(工作线程)时调用?
2)这个问题取决于第一题的答案。什么时候应该调用下一个“Begin”操作?我们应该在调用EndOperation之前甚至在调用EndOperation之后立即调用它(在排队/处理请求之前)?
3)处理队列可以简单地使用.NET线程池吗?使用.NET线程池与自己编写同步处理队列相比,有什么优势/缺点?
任何帮助都将不胜感激。
EndXXX
操作应该在回调内和外同时调用(如果请求同步完成)。这有点棘手,需要谨慎操作。可以参考这篇博客中的说明。如果你想避免这种情况,使用更优雅的解决方案,我建议你采用 TPL 和它的FromAsync
。 - Ilian