我想以异步方式从套接字读取 .
如果我使用下面的同步代码
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
2 回答
通过以这种方式编写代码,您基本上使它同步 .
使这段代码工作的正确方法是调用BeginRead,传递一个回调处理程序,它将处理准备就绪时已读取的数据,然后再进行其他工作,而不仅仅是进入循环 .
您指定的回调处理程序也将在数据流终止时触发(例如,因为连接已关闭),您可以正确处理 .
有关示例,请参阅http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.beginread.aspx .
看看我写的这篇文章,其中涵盖了CodeProject上的异步套接字,这是我从“MSDN,2005年8月,'Winsock - Get closer to the wire with high-performance sockets in .NET',Daryn Kiely,Pg 81”中学到的 .
希望这会有所帮助,最好的问候,汤姆 .