簡體   English   中英

異步I / O方法如何處理

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM