【问题标题】:UDP listener with task-based asynchronous pattern具有基于任务的异步模式的 UDP 侦听器
【发布时间】:2012-10-26 09:48:52
【问题描述】:

我在搞乱 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() 调用来保持活动状态。

【问题讨论】:

    标签: c# multithreading io task-parallel-library async-await


    【解决方案1】:

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

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

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

    【讨论】:

    • IO 完成端口没有线程“等待”IO 完成。线程“等待”是正在使用的线程。重叠的 IO 有自己的线程池,并且会在 IO 完成时使用其中一个线程。
    • @PeterRitchie:谢谢你的评论,你能解释一下这个东西吗,好像我没有深入的理解。或者你甚至可以为这个问题发布另一个更正确的答案?
    • 感谢您的回答。至少运行任务的线程还活着?当它被告知再次运行 Listen() 时,为什么它会直接死掉?
    • @lejon: 线程在线程池下运行,所以会被用于其他任务,空闲时间长了会死
    • @CuongLe:我明白了。所以你的意思是,当完成端口(以某种方式)接收到这样做的指令时,完成端口会激活线程池之外的一个线程,并带有一个指向应该处理回调的函数的指针?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 2017-04-22
    • 2014-06-19
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    相关资源
    最近更新 更多