我們應該切換到預設使用非同步 I/O 嗎?
憑藉非同步 I/O 的優勢以及現在非常容易編碼和編寫(使用 Await 和 TAP 方法),我想知道我們是否應該預設使用非同步,並且只在需要時使用同步來調整性能。
非同步 I/O 釋放呼叫執行緒並允許在等待結果時執行其他操作。另一方面,非同步 I/O 比同步慢一點。
為了強制執行響應式 UI,WinRT 設計人員發現提供僅非同步方法是可以接受的。
AFAIK Windows 文件 I/O 內部是非同步的。天真地看著這個我不清楚,為什麼 .NET 中的非同步文件 i/O 應該比同步慢。
我通常傾向於簡單性和健壯性,並且只在必要時調整性能。過去,我們預設使用同步,但呼叫某些服務以及手機等平台強制執行非同步除外。我們很少使用非同步進行調整。
在 C# 5 中使用非同步 IO 變得非常容易,但仍然存在與之相關的生產力成本。例如,您需要在必要時在以前沒有的地方添加新的關鍵字。您必須更改方法的返回類型。
如果您稍後決定某個方法應該執行 IO,則必須更改整個呼叫鏈以切換到非同步。它是一種非局部的變化,傳播到其他模組。
您無法分析非同步 IO。分析工具什麼也沒有。如果您暫停調試器,則任何執行緒堆棧上都沒有任何內容。似乎沒有人在做任何事情。那是因為非同步 IO 不持有執行緒。它只是一個資料結構(核心中的一個對象)。
該決定還取決於應用程序類型。在 WinForms 或 WPF 應用程序中,我寧願使用非同步,因為它可以很好地集成到 UI 執行緒中。
在 ASP.NET/WCF 設置中,主要優點是在呼叫長時間執行的後端服務時不會耗盡執行緒池。如果你沒有這樣的問題,而且我認為這相當罕見,那麼你從非同步 IO 中獲得的收益很少。實際上,預設情況下您會失去性能。
在 Metro 環境中,已為您做出決定。微軟(合法地)選擇用開發人員的生產力換取使用者體驗。
所以這不是一個明確的決定。在這一點上,利弊都相當薄弱。出於這個原因,我避免給出明確的建議。這在很大程度上取決於具體情況。