2010-03-01 21 views
0

我想以异步方式从套接字读取。当没有数据从套接字可用时的异步编程模型

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

 
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或不显示?

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

感谢您的帮助

AFG

回答

3

通过这种方式编写代码,你基本上使它同步。

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

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

查看http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.beginread.aspx的样本。

0

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

希望这会有所帮助, 最好的问候, 汤姆。