Question Pourquoi n'y a-t-il pas de fichier asynchrone à supprimer dans .net?


Vous avez les versions asynchrones de read et write (fonctions début / fin), mais pas de suppression (que je peux dire). Y a-t-il une raison quelconque pour cela? N'y a-t-il pas autant de raisons de supprimer de manière asynchrone en lecture / écriture?

L'utilisation du threading pour simuler un comportement asynchrone est différente des fonctions asynchrones. Grande différence, vous obtenez le traitement parallèle perçu, mais cela n'empêche pas vraiment le blocage, cet autre thread est toujours bloqué en attendant que le fichier soit terminé. Les fonctions asynchrones réelles (fonctions start / end) fonctionnent au niveau du système, elles mettent en file d'attente les fichiers i / o, permettent à l'application de continuer et indiquent à l'application quand elle est prête à continuer le fichier i / o (vous permettant de faire autre chose en attendant que le fichier soit disponible.


30
2018-05-15 18:02


origine


Réponses:


Cela serait utile. DeleteFile peut prendre jusqu'à 30 secondes si vous supprimez un partage réseau déconnecté.

La raison en est probablement qu'il n'y a pas de fonction native pour supprimer un fichier de manière asynchrone. Les API gérées sont généralement des encapsuleurs autour des non-gérés.


24
2018-05-15 19:25



Que dis-tu de ça:

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

Alors vous pouvez juste faire:

FileInfo fi = new FileInfo(fileName);
await fi.DeleteAsync(); // C# 5
fi.DeleteAsync().Wait(); // C# 4

14
2018-05-15 19:40



Si rien d'autre n'a le fichier ouvert, ouvrant un FileStream avec FileOptions.DeleteOnClose causera Windows supprimer le fichier lorsque le flux est fermé. Cela peut vous aider si vous ouvrez déjà un FileStream faire une lecture / écriture asynchrone, mais si vous avez besoin d'attendre que la suppression soit terminée, cela ne vous aidera pas (même si, selon @JoelFan, vous attendez File.Delete pour finir ne garantit pas que le fichier est effectivement supprimé de toute façon).

Il est intéressant de noter qu'en testant un partage de réseau, il semble que l'ouverture du flux en tant que tel et que l'on ne fasse rien avec celui-ci soit nettement plus rapide (~ 40%) que File.Delete:

using (new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.None, 4096, FileOptions.DeleteOnClose)) { }

3
2017-10-12 00:14



le File class n'expose pas une méthode de suppression de fichier asynchrone; cependant, en utilisant le FileStream classe, une suppression de fichier asynchrone peut toujours être effectuée en tirant parti d’un des 13 surcharges de constructeur fournies. Le code suivant va charger un fichier, le définir sur zéro octet, puis le supprimer; tout asynchrone.

using (new FileStream(Path, FileMode.Truncate, FileAccess.ReadWrite, FileShare.Delete, 1, FileOptions.DeleteOnClose | FileOptions.Asynchronous)) ;

Je ne l'ai pas beaucoup testé, vous devrez peut-être modifier légèrement l'utilisation. En outre, comme il ne renvoie aucune dérivation de la tâche, il serait probablement valable de l’exécuter avec le Task.Run méthode. Fondamentalement, il effectue une suppression de fichier qui est en fait asynchrone au niveau des E / S, de sorte que le décharger sur un pool de threads devrait être correct dans ce cas.


1
2018-01-06 11:32



Je peux me tromper, mais dans le cas où quelqu'un essaie d'accéder au même fichier lors d'une opération de threads, il serait nécessaire de bloquer l'accès au fichier jusqu'à ce que l'opération de suppression soit terminée.


0
2018-05-15 19:19



Peut-être parce que vous pouvez tout aussi facilement le faire vous-même?

var t = Task.Factory.StartNew(() => File.Delete("file.txt"));
// ...
t.Wait();

-2
2018-05-15 19:39