c# - 高性能套接字上的异步等待与线程池与多线程(C10k 解决方案?)

标签 c# multithreading sockets asynchronous threadpool

我对async-awaitpoolthread 真的很困惑。主要问题始于这个问题:“当我必须处理 10k 套接字 I/O 时我能做什么?” (又名 The C10k Problem )。

  • 首先,我尝试创建一个自定义的线程池架构 它使用一个主 Queue 和多个 Thread 来处理所有 传入数据。这是一次关于理解的很棒的经历 thread-safetymulti-threadingthread 是一个矫枉过正 现在使用 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 博客)


[附加]想了解我们在说什么的人可以阅读的好(基本)内容:

  1. Threads
  2. Async, Await
  3. ThreadPool
  4. BackgroundWorker

最佳答案

async/await 大致类似于您引用的文章中的“为每个线程提供多个客户端,并使用异步 I/O 和完成通知”方法。

虽然 asyncawait 本身不会导致任何额外的线程,但如果 async 方法恢复,它们将使用线程池线程在线程池上下文中。请注意,asyncThreadPool 的交互是高度优化的;非常怀疑您是否可以使用 ThreadThreadPool 获得相同的性能(需要合理的开发时间)。

如果可以,我建议使用现有协议(protocol) - 例如 SignalR。这将极大地简化您的代码,因为编写您自己的 TCP/IP 协议(protocol)有很多(很多)陷阱。 SignalR 可以自托管或托管在 ASP.NET 上。

关于c# - 高性能套接字上的异步等待与线程池与多线程(C10k 解决方案?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29032265/

相关文章:

c# - 将控件移动到 VS2010 中的容器中

c# - 如何在datagridview c#中只显示我的查询结果

java - 我可以创建任意数量的线程吗?

java - java中的多线程持久队列

用于连接到 NNTP 服务器的 java Socket 或 DatagramSocket

c# - 将目标框架从 v4.0 更改为 v3.5 后找不到命名空间

c# - EPPlus 不下载带有模板的 Excel 文件

c# - 线程与 FIFO 顺序同步

ios - Apple Push Notifications 可以用作消息队列吗?

sockets - (建议): Libraries for packet crafting,捕获和分析