目前我计划用C#为XNA游戏设计一个专用服务器,最多32名玩家可以同时连接。我有使用System.Net建立网络的经验,但我以前从未处理过大量的玩家。
我从心里知道,创建和销毁线程(尤其是每个玩家一个)不是一个好主意,而且我不确定是否使用ThreadPool,因为"没有线程时排队等候"的性质。因此,我决定(几乎是我唯一的最后一个选择)使用Async来处理大量客户端。
但我仍然不确定这是否是一个明智的选择,或者我是否应该使用其他东西来满足我的苛刻需求。
如果这个问题听起来很凄凉,我很抱歉,但我很困惑——非常感谢你的帮助!
如果游戏的限制真的是32个并发用户,也许还有少数观察者,那么线程是可以的,尤其是如果你发现它们比回调更容易编码的话。(您必须适当地协调对共享数据结构的访问,其复杂性可能超过相应的基于事件的设计。)
我可能甚至不会为32个并发用户的线程池而烦恼。
线程对吞吐量的限制显示大约有100个线程(当然,这取决于实现细节)。如果你从来没有打算同时使用100个用户(例如,这将是一个负载很轻的IRC服务器),那么就不需要异步事件模型,除非你和你的团队对事件模型更放心。
当服务器被I/O绑定时,异步方法很强。在等待I/O时所需的资源将减少。
当服务器受CPU限制时,线程方法非常强大。它可以轻松扩展到多个核心或CPU。
对于32个用户,我谨慎地建议使用线程,至少在异步支持为.NET的黄金时段做好准备之前。只需使用.NET中包含的线程安全结构进行所有线程间通信,不要自己编写代码,你应该没事。如果你决定自己编写代码,经验告诉我,你的情况可能更糟,因为即使是最轻微的错误也可能导致随机错误,而这些错误很难追踪。
适合您的负载取决于您计划的负载。最具性能的解决方案通常被认为是异步处理器的线程池,但这很容易造成严重的过度使用。选择最简单的解决方案来完成这项工作。