Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步等待vs线程池vs高性能套接字上的多线程(C10k解决方案?)_C#_Multithreading_Sockets_Asynchronous_Threadpool - Fatal编程技术网

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

C# 异步等待vs线程池vs高性能套接字上的多线程(C10k解决方案?),c#,multithreading,sockets,asynchronous,threadpool,C#,Multithreading,Sockets,Asynchronous,Threadpool,我对asyncwaits、pools和threads非常困惑。主要问题从这个问题开始:“当我必须处理10k套接字I/O时,我能做什么?”(aka) 首先,我尝试使用线程创建一个自定义池体系结构 它使用一个主队列和多个线程来处理所有 传入数据。这是一次关于理解的伟大经历 thread safety和multi-threading但是thread是一种过度杀伤力 现在使用async wait 后来,我用asyncwait实现了一个简单的体系结构,但是 无法理解为什么“async和await关键字不

我对
asyncwait
s、
pool
s和
thread
s非常困惑。主要问题从这个问题开始:“当我必须处理10k套接字I/O时,我能做什么?”(aka)

  • 首先,我尝试使用线程创建一个自定义池体系结构 它使用一个主
    队列
    和多个
    线程
    来处理所有 传入数据。这是一次关于理解的伟大经历
    thread safety
    multi-threading
    但是
    thread
    是一种过度杀伤力 现在使用
    async wait
  • 后来,我用
    asyncwait
    实现了一个简单的体系结构,但是 无法理解为什么“async和await关键字不会导致 要创建的其他线程。“()?我想在那里 必须有一些
    线程
    s才能执行类似的工作
  • 最后,我用
    ThreadPool
    实现了另一个体系结构,并且 看起来像是我的第一个自定义池
现在,我想应该有人和我一起对处理C10k感到困惑。我的项目是我的游戏项目的专用(中央)服务器,它是中心/大厅服务器,如的大厅或COD的配对服务器。我将执行登录操作、游戏服务器命令执行/查询和信息服务(如版本、补丁)

最后一部分可能会更具体地介绍我的项目,但我确实需要一些关于多(重)数据处理的实际解决方案的好建议

(当然,1k-10k-100k连接处理取决于服务器硬件,但这是一个一般性问题)


重点:(MSDN博客)


[附加]好的(基本的)读物谁想了解我们在说什么:


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

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


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

    否。如果我们使用.NET在4.5中引入的异步编程模式,在大多数情况下,我们不需要自己创建手动线程。编译器完成了开发人员过去所做的困难工作。创建一个新线程是昂贵的,它需要时间。除非我们需要控制线程,否则“基于任务的异步模式(TAP)”和“任务并行库(TPL)”对于异步和并行编程来说已经足够了。TAP和TPL使用任务。一般情况下,Task使用ThreadPool中的线程(线程池是由.NET framework创建和维护的线程的集合。如果我们使用Task,大多数情况下我们不需要直接使用线程池。线程可以做更多有用的事情。您可以阅读更多关于

    通过使用异步编程,您可以避免性能瓶颈并增强应用程序的整体响应能力。异步对于可能阻塞的活动(例如,当应用程序访问web时)至关重要。对web资源的访问有时会很慢或延迟。如果在在同步进程中,整个应用程序必须等待。在异步进程中,应用程序可以继续执行不依赖于web资源的其他工作,直到潜在阻塞任务完成

    Await专门设计用于处理耗时的事情,最典型的是I/O请求。传统上,这是在I/O请求完成时通过回调完成的。编写依赖于这些回调的代码非常困难,Await极大地简化了它。Await只负责处理延迟,它不会执行其他操作线程所做的一切。await关键字右侧的await表达式就是完成任务的方法。您可以将Async与任何返回任务的方法一起使用。XxxxAsync()方法只是.NET framework中的预编程方法,用于需要时间的常见操作。例如从web服务器下载数据


    我建议您阅读

    关于
    await
    -
    async
    的引用,这是我在官方文档中见过的最故意误导人的东西。我记得在预览过程中,我浏览了几十份文档,他们都说这个模式好像没有使用线程,他们在线程代码fl中做了一些疯狂的事情哦,但那不是真的。他们的意思是,它不产生新线程,而是使用普通的
    任务.StartNew
    线程池。@Blindy你错了。async/await本身不使用
    任务.StartNew
    。如果你自己不调用它,它不会创建任何线程或调用
    任务。StartNew
    wait
    关键字只是设置延续,就这样了。@Sriram说的是盲目的。特别是在异步I/O的情况下,回调本身只需要一个线程——这意味着通常只需几个线程就可以处理数千个连接(通常是CPU核心数量的两倍左右-毕竟,如果您以非CPU异步方式执行所有操作,那么您的限制是100%CPU,在这种情况下添加线程无助于提高吞吐量)。让我再问一个问题:
    ThreadPool
    Task
    cr