好吧,我想我已经理解了整个异步/等待的事情。每当你等待某些事情时,你正在运行的函数都会返回,从而允许当前线程在异步函数完成时执行其他操作。好处是你不会开始一个新的线程。异步/等待和任务
这并不难理解,因为它有点像Node.JS的工作原理,除了Node使用大量的回调来实现这一点。这是我无法理解优势的地方。
套接字类当前没有任何异步方法(与async/await一起使用)。我当然可以将一个套接字传递给流类,并在那里使用异步方法,但是这会给接受新套接字带来问题。
据我所知,有两种方法可以做到这一点。在这两种情况下,我都会在主线程的无限循环中接受新的套接字。在第一种情况下,我可以为我接受的每个套接字启动一个新任务,并在该任务中运行stream.ReceiveAsync。但是,不会等待实际阻止该任务,因为任务没有其他任何事情要做?这又会导致线程池中产生更多的线程,这再次不如在任务内使用同步方法更好?
我的第二个选择是将所有接受的套接字放入几个列表之一(每个线程一个列表),并在这些线程内部运行一个循环,为每个套接字运行awaiting stream.ReceiveAsync。这样,每当我遇到await,stream.ReceiveAsync并开始从所有其他套接字接收。
我想我真正的问题是,如果这比任何线程池更有效,并且在第一种情况下,如果真的会比仅使用APM方法更糟。我也知道你可以使用await/async将APM方法包装到函数中,但是我看到它的方式,仍然会遇到APM方法的“缺点”,并且会在async/await中额外支付状态机的开销。
tl; dr ...你有什么编码问题吗? – 2013-02-25 10:19:27
查看http://blogs.msdn.com/b/pfxteam/archive/2011/12/15/10248293.aspx查看可以异步使用以有效方式等待套接字操作的可重用方法的示例。 – 2013-02-25 10:58:27
我应该补充一点,基于任务的异步模式是MS推荐的新模式。 http://msdn.microsoft.com/en-us/library/vstudio/hh873175.aspx – 2013-02-25 11:02:23