58

非同期バージョンの読み取りと書き込み (関数の開始/終了) がありますが、削除のバージョンはありません (私が知ることができます)。これには何か理由がありますか?読み取り/書き込みと同じくらい非同期に削除する理由はありませんか?

スレッドを使用して非同期動作をシミュレートすることは、非同期関数と同じではありません。大きな違いは、認識された並列処理が確実に得られることですが、実際にはブロックを防止するものではなく、ファイル i/o が完了するのを待って他のスレッドがまだブロックされていることです。実際の非同期関数 (begin/end 関数) はシステム レベルで動作し、ファイル I/O をキューに入れ、アプリケーションを続行させ、ファイル I/O を続行する準備が整ったときにアプリケーションに通知します (ファイル i/o が利用可能になるのを待っている間に他のことをします)。

4

6 に答える 6

44

これは役に立ちます。切断されたネットワーク共有で削除する場合、DeleteFile には最大 30 秒かかることがあります。

その理由は、ファイルを非同期で削除するためのネイティブ関数がないためである可能性があります。マネージ API は通常、アンマネージ API のラッパーです。


ネイティブの非同期ファイル削除 API がないのはなぜでしょうか? ネイティブの非同期削除をそのまま Windows に実装するのは困難です。DeleteFile疑似コードCreateFileplus NtSetInformationFile(Disposition, Delete)plusで行いCloseHandleます。非同期はありませんCreateFile(私の意見では、Windows の設計上のバグです)。NtSetInformationFileカーネルのファイル データ構造にフラグを設定するだけです。非同期にすることはできません。実際の削除は、最後のハンドルが閉じられたときに発生します。CloseHandleこれにより、Windows のもう 1 つの設計上の問題であるブロッキングが発生する可能性があると思います。async はありませんCloseHandle

于 2012-05-15T19:25:59.837 に答える
15

これはどう:

public static class FileExtensions {
   public static Task DeleteAsync(this FileInfo fi) {
      return Task.Factory.StartNew(() => fi.Delete() );
   }
}

次に、次のことができます。

FileInfo fi = new FileInfo(fileName);
await fi.DeleteAsync(); // C# 5
fi.DeleteAsync().Wait(); // C# 4
于 2012-05-15T19:40:36.830 に答える
14

このFileクラスは、非同期ファイル削除メソッドを公開しません。ただし、このFileStreamクラスを使用すると、提供されている 13 のコンストラクター オーバーロードのうちの特定の 1 つを利用して、非同期ファイル削除を引き続き実行できます。次のコードは、ファイルを非同期的に削除します。

using (new FileStream(Path, FileMode.Open, FileAccess.Read, FileShare.None, 1, FileOptions.DeleteOnClose | FileOptions.Asynchronous)) ;

あまりテストしていないので、使い方を少し変更する必要があるかもしれません。(削除中に他のスレッドによるファイル アクセスがブロックされないようにする場合は、別のものに変更FileShare.Noneすることをお勧めします。) また、このコードは Task の派生を返さないため、Task.Runメソッドで実行することはおそらく有効です。基本的に、I/O レベルで実際には非同期のファイル削除を実行するため、この場合はスレッド プールにオフロードしても問題ありません。

于 2018-01-06T11:32:31.407 に答える
0

間違っているかもしれませんが、誰かがクロススレッド操作で同じファイルにアクセスしようとした場合、削除操作が完了するまでファイルへのアクセスをブロックする必要があります。

于 2012-05-15T19:19:52.577 に答える
-5

おそらく、自分で簡単にできるからでしょうか?

var t = Task.Factory.StartNew(() => File.Delete("file.txt"));
// ...
t.Wait();
于 2012-05-15T19:39:03.720 に答える