我看到System.IO中的簡單文件系統操作不是異步的(移動文件,刪除文件)。遵循這個原則 - 小型查詢應該是異步的嗎?如果是的話,小查詢的邊界是什麼? < 5毫秒? < 50毫秒?小型查詢應該是異步的嗎?
2
A
回答
2
當異步API可用時,幾乎沒有理由使用同步調用。棘手的部分是許多操作沒有異步API。
System.IO
的工作原理源於過去很長一段時間的設計決策,例如網絡驅動器(更少的「雲存儲」)比較少見,驅動器也很小。諸如「打開文件」之類的操作沒有異步API,而其他一些具有異步API的程序並不一定在.NET中提供它們。
你很少需要考慮異步調用的代價 - 與任何I/O操作相比,這將是微不足道的。所以訣竅在於考慮不涉及實際I/O的情況 - 例如,當從一個字節逐字節讀取文件時,實際上大部分時間都是從內存緩衝區中讀取的,這使得異步開銷顯着。但替代方案不使用同步API,它確保緩衝在合理的數據塊上進行,而不是單個字節。
沒有什麼能夠讓異步API本質上變慢。例如,Windows中的同步文件API仍然會調用異步API,然後等待結果(標誌中有一些差異,但沒有什麼重要)。由於Windows 2000(IIRC在95年代Windows中的支持有點棘手),在桌面Windows世界中還沒有真正的同步I/O操作。
如果文件系統API是今天設計的,File.Move
將肯定是異步操作。事實上,在Windows API中,還有兩種更現代的變體 - MoveFileEx
和MoveFileWithProgress
,它們都是異步的。唯一的問題是,.NET不直接公開這些,所以你需要使用P/Invoke來調用它們。不用說,它們對網絡共享非常有用。
相關問題
- 1. 異步API應該同步拋出嗎?
- 2. 我應該公開異步方法嗎?
- 3. 我應該使用異步處理嗎?
- 4. ActiveSupport ::通知應該是異步的?
- 5. Java EE中應該每個REST端點都是異步的嗎?
- 6. 使異步查詢同步
- 7. 異步表查詢
- 8. 異步Mongoose查詢
- 9. 我應該實現異步並行還是異步任務
- 10. 異步批量查詢是否也受最大響應大小的限制?
- 11. 是forEach()異步嗎?
- 12. 是Parse.initialize()異步嗎?
- 13. 該查詢的返回類型應該是什麼?
- 14. 小黃瓜情況應該總是有步驟嗎?
- 15. lowdb:查詢是同步的還是異步的?
- 16. 的MS Access異步查詢
- 17. 我應該試圖捕捉任何EnityManager查詢異常嗎?
- 18. Graphics.DrawImage是異步的嗎?
- 19. ftruncate()是異步的嗎?
- 20. cudaFree()是異步的嗎?
- 21. ImageIO.read()是異步的嗎?
- 22. Redis:PUBLISH是異步的嗎?
- 23. jooq流是異步的嗎?
- 24. 應該在代碼中實現一個小型查找表嗎?
- 25. Nginx應該與支持異步編程模型的語言結合嗎?
- 26. 是不是VBA Shell應該是異步的?
- 27. 我應該使用子查詢嗎?
- 28. 異步EF查詢在F#
- 29. 角異步查詢請求
- 30. PHP MySQLi異步查詢
如果你在gui上做IO,你可以得到攤位。你會在動畫中看到50ms的檔位。這完全取決於;目前的解決方案是可以接受的。 –
如果您查看[最近設計的API](https://msdn.microsoft.com/en-us/library/windows/apps/windows.storage.storagefile.aspx),您可能會形成不同的印象。 –
@Damien_The_Unbeliever不錯的一個,還沒有看到它,但... –