好的,我想我已经理解了整个异步/等待的事情。每当您等待某事时,您正在运行的函数都会返回,从而允许当前线程在异步函数完成时执行其他操作。优点是您不会启动新线程。
这并不难理解,因为它有点像 Node.JS 的工作原理,除了 Node 使用大量回调来实现这一点。然而,这是我无法理解优势的地方。
套接字类目前没有任何 Async 方法(与 async/await 一起使用)。我当然可以将一个套接字传递给流类,并在那里使用异步方法,但是这会给接受新套接字留下一个问题。
据我所知,有两种方法可以做到这一点。在这两种情况下,我都在主线程的无限循环中接受新套接字。在第一种情况下,我可以为我接受的每个套接字启动一个新任务,并在该任务中运行 stream.ReceiveAsync。但是,await 不会真正阻止该任务,因为该任务将无事可做?这又会导致在线程池上产生更多线程,这又不比在任务中使用同步方法更好?
我的第二个选择是将所有接受的套接字放在几个列表之一(每个线程一个列表)中,并在这些线程内运行一个循环,为每个套接字运行 await stream.ReceiveAsync。这样,每当我遇到等待时,stream.ReceiveAsync 并开始从所有其他套接字接收。
我想我真正的问题是这是否比线程池更有效,并且在第一种情况下,它是否真的比仅使用 APM 方法更糟糕。
我也知道您可以使用 await/async 将 APM 方法包装到函数中,但在我看来,您仍然会得到 APM 方法的“缺点”,以及 async/await 中状态机的额外开销。