2

我在搞乱 UDP 侦听器和 TAP。

我有一个类负责监听传入的 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() 调用来保持线程处于活动状态。

4

1 回答 1

1

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

是的,完全正确,此操作不受 CPU 限制,而是受 IO 限制。因此,线程池中根本没有线程被阻塞等待操作完成。

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

于 2012-10-26T11:22:07.667 回答