好吧,我想我已經理解了整個異步/等待的事情。每當你等待某些事情時,你正在運行的函數都會返回,從而允許當前線程在異步函數完成時執行其他操作。好處是你不會開始一個新的線程。異步/等待和任務
這並不難理解,因爲它有點像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