套接字中没有可用数据时的异步编程模型

Posted

技术标签:

【中文标题】套接字中没有可用数据时的异步编程模型【英文标题】:Asynchronous Programming Model when no data is available from a socket 【发布时间】:2011-01-22 08:19:54 【问题描述】:

我想以异步方式从套接字读取。

如果我使用下面的同步代码

StreamReader aReadStream = new StreamReader(aStream); 字符串 aLine = aReadStream.ReadLine(); // 应用程序可能会交给这里

如果连接有效,但没有可读取的数据,应用程序将在 ReadLine() 函数处挂起。

如果我使用异步编程模型切换到下面的代码

NetworkStream aStream = aClient.GetStream(); 而(真) IAsyncResult res = aStream.BeginRead(data, 0, data.Length, null, null); 如果(res.IsCompleted) Trace.WriteLine("这里"); 别的 线程.睡眠(100);

在同样的情况下会发生什么?如果没有要读取的数据,变量res 是否会显示为Completed

最重要的是,当没有数据要读取时,我在那个while循环中对aStream.BeginRead()的所有调用都是在线程池中连续调度的吗?如果这是真的,我是否冒着降低应用程序性能的风险,因为线程池的大小增加了太多?

感谢您的帮助

AFG

【问题讨论】:

【参考方案1】:

通过以这种方式编写代码,您基本上实现了同步。

使这段代码工作的正确方法是调用 BeginRead,传递一个回调处理程序,该处理程序将在准备好时处理已读取的数据,然后去做其他工作,而不是仅仅进入一个循环。

您指定的回调处理程序也将在您可以适当处理的数据流终止(例如,因为连接已关闭)时触发。

有关示例,请参阅 http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.beginread.aspx。

【讨论】:

【参考方案2】:

看看我在CodeProject 上写的这篇文章,它涵盖了异步套接字,这是我从“MSDN,2005 年 8 月,'Winsock - 使用高性能套接字更接近线路”中学到的.NET',Daryn Kiely,第 81 页。”

希望这会有所帮助, 最好的祝福, 汤姆。

【讨论】:

以上是关于套接字中没有可用数据时的异步编程模型的主要内容,如果未能解决你的问题,请参考以下文章

使用异步套接字编程发送二进制数据并读取其值

在 Delphi 中进行异步套接字编程的惯用方法是啥?

使用 async/ await 进行 异步 编程

python异步套接字编程

低功耗设计的最佳编程模型:异步编程

思考!低功耗设计的最佳编程模型:异步编程