2012-10-26 71 views
2

我在搞乱UDP侦听器和TAP。具有基于任务的异步模式的UDP侦听器

我有一个类负责监听传入的UDP并可以启动和停止。 在start()方法简单地调用下面的方法

private async void Listen() 
    { 
     var resp = await _udpClient.ReceiveAsync().ConfigureAwait(continueOnCapturedContext: false); 

     var eventHandler = PacketReceived; 
     if (eventHandler != null) 
      eventHandler(this, new UdpPacketReceivedEventArgs(resp)); 

     if (_running) 
      Listen(); 
    } 

这是正确的吗?我有点担心我可能会耗尽线程池,因为线程正在通过产生一个新的Listen()调用而保持活动状态。

回答

1

这是正确的吗?我有点担心我可能会耗尽线程池,因为线程正在通过产生一个新的Listen()调用而保持活动状态。

是的,这是完全正确,这种操作不CPU绑定,它的IO约束。因此,线程池中没有任何被阻塞的线程等待操作完成。

有一个线程等待网络请求完成,但它在所有网络请求(如UI线程)之间共享。它在Windows上称为IO完成端口线程。当网络请求完成时,操作系统中的中断处理程序将作业添加到IO完成端口的队列中。要执行1000个网络请求,请求都会启动,并且随着响应到达,它们将由单个IO完成端口轮流处理。

+1

IO完成端口没有线程“等待”IO完成。线程“等待”是一个正在使用的线程。重叠IO拥有自己的线程池,并在IO完成时使用其中一个线程。 –

+0

@PeterRitchie:谢谢你的评论,你能解释一下这个东西吗?好像我没有深刻的理解。或者甚至你可以为这个问题发布另一个更正确的答案? –

+0

感谢您的回答。至少运行任务的线程还活着?当它被告知再次运行Listen()时,它为什么会死? – kasperhj