gpt4 book ai didi

.net - .Net异步套接字操作限制?

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

是否有待执行的异步操作是应谨慎使用的宝贵资源?

我有很多连接的TcpClient,这些输入是我不希望收到的,但是如果万一操作不当,则需要保持输入缓冲区为空。如果每个无限期保持打开状态的已连接客户端都有一个BeginRead(),是否有任何危害?当客户端最终关闭时,将调用该回调,如果!asyncResult.IsCompleted,我可以直接从中退出。

我不知道要开始读取多少字节,尽管我相信我可以共享一个缓冲区。达到该缓冲区限制的输入只能放在流中,未读。有没有更好的方法可以有效地丢弃,禁止或等待流中数据的可用性?

否则,我需要轮询可用数据。

谢谢!

最佳答案

这取决于您所运行的操作系统...

待处理的recv将使用一些非页面缓冲的池,这将导致某些页面的内存被锁定以进行I/O。

在Windows Vista之前,非页面缓冲池非常令人恐惧,它是一台机器范围的商品,如果用完它会导致设计不良的驱动程序崩溃...因此,在Vista之前的操作系统上,您可能会从底层获得“ENOBUFS”错误由于缺少非页面缓冲池,所以I/O系统重叠。有关非页面缓冲池限制的更多详细信息,请参见此处:http://www.lenholgate.com/blog/2009/03/excellent-article-on-non-paged-pool.html

挂起的Recv使用的另一资源是在操作挂起时为I/O锁定了一个或多个内存页。可以锁定的页数有一个有限的限制,因此,在某些情况下,您可能会再次从基础I/O系统获得“ENOBUFS”。

当然,这些限制是否影响您取决于您​​有多少个连接。

处理非托管代码中的锁定I/O页数限制的“标准”方法是发布零字节读取,即具有实际上为0字节长的缓冲区的读取。这意味着在读取未决期间,没有缓冲区空间被锁定;完成读取后,您只需发布普通读取或同步读取即可。

关于.net - .Net异步套接字操作限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5143716/

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