我对async-await
、pool
和thread
真的很困惑。主要问题始于这个问题:“当我必须处理 10k 套接字 I/O 时我能做什么?” (又名 The C10k Problem )。
- 首先,我尝试创建一个自定义的线程池架构
它使用一个主
Queue
和多个Thread
来处理所有 传入数据。这是一次关于理解的很棒的经历thread-safety
和multi-threading
但thread
是一个矫枉过正 现在使用async-await
。 - 后来,我用
async-await
实现了一个简单的架构,但我 无法理解为什么 “async 和 await 关键字不会导致 要创建的额外线程。” ( from MSDN )?我认为有 必须有一些thread
来完成类似BackgroundWorker 的工作. - 最后,我用
ThreadPool
实现了另一种架构,它 看起来像是我的第一个自定义池。
现在,我想应该还有其他人对处理 C10k 感到困惑。我的项目是我的游戏项目的专用(中央)服务器,它是集线器/大厅服务器,如 MCSG的大厅或 COD 的配对服务器。我将执行登录操作、游戏服务器命令执行/查询和信息服务(如版本、补丁)。
最后一部分可能更具体地介绍了我的项目,但我确实需要一些关于多(重)数据处理的现实世界解决方案的好建议。
(也是,1k-10k-100k 连接处理取决于服务器硬件,但这是一个普遍问题)
关键点:Choosing Between the Task Parallel Library and the ThreadPool (MSDN 博客)
[附加]想了解我们在说什么的人可以阅读的好(基本)内容:
最佳答案
async
/await
大致类似于您引用的文章中的“为每个线程提供多个客户端,并使用异步 I/O 和完成通知”方法。
虽然 async
和 await
本身不会导致任何额外的线程,但如果 async
方法恢复,它们将使用线程池线程在线程池上下文中。请注意,async
与 ThreadPool
的交互是高度优化的;非常怀疑您是否可以使用 Thread
或 ThreadPool
获得相同的性能(需要合理的开发时间)。
如果可以,我建议使用现有协议(protocol) - 例如 SignalR。这将极大地简化您的代码,因为编写您自己的 TCP/IP 协议(protocol)有很多(很多)陷阱。 SignalR 可以自托管或托管在 ASP.NET 上。
关于c# - 高性能套接字上的异步等待与线程池与多线程(C10k 解决方案?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29032265/