2016-09-19 16 views
2

System.IOの単純なファイルシステムアクションが非同期(ファイルの移動、ファイルの削除)ではないことがわかります。その原則に従う - 小さなクエリが非同期であるべきか?もしそうなら、小さなクエリの境界は何ですか? < 5 ms? < 50 ms?小さなクエリを非同期にする必要がありますか?

+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には、2つの最新のバリアント、MoveFileExMoveFileWithProgressがあります。両方とも非同期です。唯一の問題は、.NETがそれらを直接公開しないため、P/Invokeを使用して呼び出す必要があることです。言うまでもなく、それらはネットワーク共有に非常に便利です。

関連する問題