首页 文章

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

提问于
浏览
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 或不显示?

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

谢谢您的帮助

AFG

2 回答

  • 3

    通过以这种方式编写代码,您基本上使它同步 .

    使这段代码工作的正确方法是调用BeginRead,传递一个回调处理程序,它将处理准备就绪时已读取的数据,然后再进行其他工作,而不仅仅是进入循环 .

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

    有关示例,请参阅http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.beginread.aspx .

  • 0

    看看我写的这篇文章,其中涵盖了CodeProject上的异步套接字,这是我从“MSDN,2005年8月,'Winsock - Get closer to the wire with high-performance sockets in .NET',Daryn Kiely,Pg 81”中学到的 .

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

相关问题