我想以异步方式从套接字读取。
如果我使用下面的同步代码
StreamReader aReadStream = new StreamReader(aStream); String aLine = aReadStream.ReadLine(); // application might hand here
使用有效的开放连接,但没有可用于读取的数据,应用程序将挂起在ReadLine()函数中。
如果我使用异步编程模型切换到下面的代码
NetworkStream aStream = aClient.GetStream(); while(true) { IAsyncResult res = aStream.BeginRead(data, 0, data.Length, null, null); if (res.IsCompleted){ Trace.WriteLine("here"); } else { Thread.Sleep(100); } }
在同一场景中会发生什么?如果没有要阅读的数据,变量res
将显示为Completed
或不显示?
最重要的是,当没有数据要读取时,我在aStream.BeginRead()
循环的所有调用都是在线程池中连续调度的?如果这是真的,我冒着降低应用程序性能的风险,因为线程池的大小增加了太多?
感谢您的帮助
AFG
答案 0 :(得分:3)
通过这种方式编写代码,你基本上使它同步。
使这段代码工作的正确方法是调用BeginRead,传递一个回调处理程序,它将处理准备就绪时已读取的数据,然后再进行其他工作,而不仅仅是进入循环。
您指定的回调处理程序也将在数据流终止时触发(例如,因为连接已关闭),您可以正确处理。
请参阅http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.beginread.aspx了解样本。
答案 1 :(得分:0)
看看我写的这篇文章,其中涵盖了CodeProject上的异步套接字,这是我从2005年8月的“MSDN”中学到的,'Winsock - 更接近高线.NET中的性能套接字,Daryn Kiely,第81页。“
希望这有帮助, 最好的祝福, 汤姆。