2016-09-19 36 views
2

我看到System.IO中的簡單文件系統操作不是異步的(移動文件,刪除文件)。遵循這個原則 - 小型查詢應該是異步的嗎?如果是的話,小查詢的邊界是什麼? < 5毫秒? < 50毫秒?小型查詢應該是異步的嗎?

+0

如果你在gui上做IO,你可以得到攤位。你會在動畫中看到50ms的檔位。這完全取決於;目前的解決方案是可以接受的。 –

+3

如果您查看[最近設計的API](https://msdn.microsoft.com/en-us/library/windows/apps/windows.storage.storagefile.aspx),您可能會形成不同的印象。 –

+0

@Damien_The_Unbeliever不錯的一個,還沒有看到它,但... –

回答

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中,還有兩種更現代的變體 - MoveFileExMoveFileWithProgress,它們都是異步的。唯一的問題是,.NET不直接公開這些,所以你需要使用P/Invoke來調用它們。不用說,它們對網絡共享非常有用。