[英]How are asynchronous I/O methods processed
閱讀了大量有關異步等待的內容之后,我只能在GUI線程(WPF / WinForms)中找到使用它的好處。
在什么情況下會減少WCF服務中線程的創建? 程序員是否必須通過選擇在Web服務中實現async-wait來對服務中的每個方法都使用async-await? 在充滿async-await的服務中制作一些非async-await方法會重新利用我的服務效率嗎? 怎么樣?
最后一個問題-有人說使用'await Task.Run(()=> ...)'不是“真正的異步等待”。 這么說是什么意思?
謝謝,斯塔夫。
編輯:
這兩個答案都很棒,但是對於北斗如何解釋異步等待的工作方式,我建議在這里閱讀@Stephen Cleary答案: https ://stackoverflow.com/a/7663734/806963
需要以下主題才能理解他的答案:SynchronizationContext,SynchronizationContext.Current,TaskScheduler,TaskScheduler.Current,線程池。
服務器應用程序(如WCF)中異步/等待的真正好處是異步I / O。
當您調用同步I / O方法時,調用線程將被阻塞,等待I / O完成。 該線程不能被其他請求使用,它只是等待結果。 當更多請求到達時,線程池將創建更多線程來處理它們,從而浪費大量資源-內存,當等待線程被釋放時上下文切換...
如果使用異步IO,則不會阻塞線程。 啟動異步IO操作后,線程池再次可以使用它。 異步操作完成后,線程池將分配一個線程以繼續處理請求。 沒有資源浪費。
來自MSDN (關於文件I / O,但也適用於其他文件)
在同步文件I / O中,線程啟動I / O操作並立即進入等待狀態,直到I / O請求完成。 執行異步文件I / O的線程通過調用適當的函數將I / O請求發送到內核。 如果內核接受了該請求,則調用線程繼續處理另一個作業,直到內核向線程發出I / O操作完成的信號。 然后,它會中斷其當前作業,並根據需要處理來自I / O操作的數據。
現在您可能會看到,如果任務中的IO是同步完成的,那么為什么await Task.Run()
不會帶來任何好處。 無論如何,線程都會被阻塞,而不會被稱為Task.Run()
的線程阻塞。
您不需要異步地實現每個方法就可以看到性能的提高(盡管應該習慣於始終異步執行I / O)。
在什么情況下會減少WCF服務中線程的創建?
如果您有等待IO操作(從數據庫讀取,調用外部Web服務等)的操作,則使用async / await可以釋放正在處理WCF請求的托管線程。 這使線程可用於其他請求,等待IO完成。 它可以更有效地使用線程池。
在大量閱讀了有關async-await的內容之后,我只能發現在GUI線程中使用它的好處
對於客戶端應用程序,這是我知道的關鍵優勢,因為與服務器應用程序相比,用完托管線程的可能性要小得多。
有人說使用'await Task.Run(()=> ...)'不是“真正的異步等待”。
您分配了一個新的托管線程來運行新任務,因此您不會保存任何托管線程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.