c# - 在Windows上,C#在数据到达之前或之后,Socket.BeginReceive()是否占用后台线程?

标签 c# multithreading sockets

如果在数据到达之前需要后台线程,并且当许多连接等待数据时,将存在太多线程,从而导致性能下降。有没有一种方法可以在不占用线程的情况下等待数据?

最佳答案

NET.NET中的Socket.BeginReceive()和其他异步I/O方法都使用IOCP线程池。简短的版本是,这是管理I/O的非常有效的方法。几乎不需要等待I/O完成的成本,即使I/O完成,也可以从线程池线程中调用完成回调,并且仅在完成回调所需的时间内就占用该线程。

“IOCP”代表 native Windows API中的“IO完成端口”。基本思想是,您可以有一个线程,也可以有一些线程的小集合,都准备为完成大量I/O操作提供服务。这使I/O操作可以很好地扩展到成千上万个(即使不是上百万个)并发操作,同时仍然只需要相对较少数量的线程即可处理所有这些操作。

因此,请继续使用那些异步I/O API。它们是编写可伸缩I/O代码的最佳方法。

(此外:Socket类尤其具有许多异步选项。具有讽刺意味的是,以...Async结尾的方法不符合C#中的new(er)async/await范例,但实际上,它们是我可扩展性最高的方法/O使用Socket,因为它们不仅使用IOCP线程池,而且还允许您重用I/O状态对象,因此您可以拥有这些对象的池并最大程度地减少GC负载。)

关于c# - 在Windows上,C#在数据到达之前或之后,Socket.BeginReceive()是否占用后台线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42847851/

相关文章:

c# - Caliburn.Micro 让它将 MainView 中的 UserControls 绑定(bind)到他们的 ViewModels

java - 结果集和语句未在 Java 中关闭的影响

sockets - 是 Socket.BeginReceive(IList<ArraySegment<byte>> 缓冲区.. 不是异步的吗?

sockets - 如何告诉服务器客户端已经完成输出而不关闭输出流

c# - 具有FMOD的动态DSP.setParameter

c# - Entity Framework 类型初始值设定项异常

multithreading - 了解如何实现线程

ios - 繁重的 CPU 处理以加热设备

c - 内存中的套接字文件描述符是什么形式?

c# - 将整数中的一位与另一位交换,代码不起作用