MFa*_*MAR 11 c# sockets multithreading asynchronous threadpool
我对async-awaits,pools和threads 感到困惑.主要问题始于这个问题:"当我必须处理10k套接字I/O时,我该怎么办?" (又名C10k问题).
Queue和多个Threads来处理所有传入数据的线程来创建自定义池化架构.这是关于理解一个伟大的经验
thread-safety和multi-threading但是thread是一个矫枉过正
与async-await时下.async-await但我无法理解为什么"async和await关键字不会导致创建额外的线程." (来自MSDN)?我认为必须要做一些thread像BackgroundWorker这样的工作.ThreadPool它看起来像我的第一个自定义池.现在,我认为我应该有其他人对处理C10k感到困惑.我的项目是我的游戏项目的专用(中央)服务器,它是集线器/大厅服务器,如MCSG的大厅或COD的配对服务器.我将进行登录操作,游戏服务器命令执行/查询和服务信息(如版本,补丁).
最后一部分可能对我的项目更具体,但我真的需要一些关于多个(重)数据处理的真实世界解决方案的好建议.
(也就是说,1k-10k-100k连接处理取决于服务器硬件,但这是一般性问题)
关键点:在任务并行库和ThreadPool之间选择(MSDN博客)
[附加]想要了解我们在谈论什么的好(基本)事物:
async/await大致类似于您引用的文章中的“使用每个线程为多个客户端提供服务,并使用异步 I/O 和完成通知”方法。
虽然async它们本身不会导致任何额外的线程,但如果方法在线程池上下文上恢复,await它们将使用线程池线程。async请注意,async与的交互ThreadPool是高度优化的;Thread您是否可以使用或ThreadPool获得相同的性能(具有合理的开发时间)是非常值得怀疑的。
如果可以的话,我建议使用现有协议 - 例如 SignalR。这将极大地简化您的代码,因为编写您自己的 TCP/IP 协议有很多(很多)陷阱。SignalR 可以自托管或托管在 ASP.NET 上。