当套接字没有数据时,异步编程模型

时间:2010-03-01 15:31:01

标签: c# sockets

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

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

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 个答案:

答案 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页。“

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