套接字中没有可用数据时的异步编程模型
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 页。”
希望这会有所帮助, 最好的祝福, 汤姆。
【讨论】:
以上是关于套接字中没有可用数据时的异步编程模型的主要内容,如果未能解决你的问题,请参考以下文章