gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:53:05 25 4
gpt4 key购买 nike

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

最佳答案

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com