C#Sockets:我真的需要这么多独立的线程吗

C#Sockets:我真的需要这么多独立的线程吗,c#,multithreading,sockets,C#,Multithreading,Sockets,我正在用C#编写一个服务器。msdn.microsoft.com上的异步示例建议如下 开始侦听客户端(当客户端调用时启动一个新线程)(&T) 开始接收来自客户端的数据(&启动一个新线程来执行此操作) 开始发送回复以向客户端发送数据(&在上启动另一个线程) 在这一点上,似乎有4个独立的线程,而从我(可能很幼稚)的角度来看,实际上只需要2个线程。1用于服务器继续侦听,1用于与客户端的对话。为什么我与客户机的对话需要3个线程,因为我必须在发送之前等待回复,而在等待从客户机接收数据时,我不会做任何其他事

我正在用C#编写一个服务器。msdn.microsoft.com上的异步示例建议如下

  • 开始侦听客户端(当客户端调用时启动一个新线程)(&T)
  • 开始接收来自客户端的数据(&启动一个新线程来执行此操作)
  • 开始发送回复以向客户端发送数据(&在上启动另一个线程)
  • 在这一点上,似乎有4个独立的线程,而从我(可能很幼稚)的角度来看,实际上只需要2个线程。1用于服务器继续侦听,1用于与客户端的对话。为什么我与客户机的对话需要3个线程,因为我必须在发送之前等待回复,而在等待从客户机接收数据时,我不会做任何其他事情


    干杯

    开始接受
    不会启动新线程。它将处理程序附加到操作系统级挂钩。没有线程将完成此操作的主要工作。这同样适用于
    BeginReceive
    BeginSend
    。所有这些都没有启动新线程

    当为其添加处理程序的事件实际触发时,将创建一个线程池线程来响应所发生的操作。这里完成的CPU限制工作通常应该很低。您将在这里看到,请求的线程池线程很多,但它们所做的工作很少,因此它们会很快被发送回线程池


    线程池就是为这种类型的使用而设计的。您可以只创建1-2个线程,并不断重复使用它们来依次响应所有这些事件,而不是为每个事件响应创建完整的线程(这将非常昂贵)。池将只创建足够多的线程来满足足够小的积压工作。

    虽然主线程将围绕这些操作进行编组,但您不必自己“启动线程”。 BeginAccept是一个非阻塞方法-.NET将立即从它返回,但在异步实现其目的时调用线程池上的回调。
    线程池的优化超出了您的控制。

    我认为您将线程与异步操作混淆了。附带说明:
    Begin*
    方法是较旧的异步API-Socket有一个较新的异步API此问题与此密切相关:感谢@Servy的回复。我知道在事件发生之前,Begin***不会启动线程。当事情的顺序必须是依次的:接受等待…,接收等待…,回复等待…,接收等待…时,我仍然不认为使用池中的多个线程进行客户端对话更好。。。等等(即,如果我不等待每个片段完成,然后再转到下一个片段,则程序可以工作)?干杯。@Shanie好吧,另一种选择是让一根线坐在那里什么也不做,而所有的操作都在进行。您将有1个线程花费绝大多数时间坐在那里无所事事。因此,为了跟上工作负载,实际上需要几个线程来执行此操作(无所事事)。一个单线程池线程,考虑到它只需要在有真正的CPU限制的工作要做时被“占用”,实际上可以更快地处理请求。看来我需要进一步研究线程池。谢谢你的帮助。