Laden...

Best practice zur Löschung mehrerer Dateien nach Upload

Erstellt von emuuu vor einem Jahr Letzter Beitrag vor einem Jahr 397 Views
emuuu Themenstarter:in
286 Beiträge seit 2011
vor einem Jahr
Best practice zur Löschung mehrerer Dateien nach Upload

Moin zusammen,

hab mal eine Frage die ein bisschen ins Verständnis von Tasks geht:
(Vereinfachte) Ausgangslage: Hab eine List<string> die zu verschiedenen Dateien führen, diese sollen in einen MultipartFormDataContent gepackt und dann via httpclient.PostAsynch hochgeschickt werden und danach gelöscht werden.
Von der Struktur her in etwa so:


interface IServiceA
{
   Task<MultipartFormDataContent> BuildFormData(IEnumerable<string> filePaths);
}

interface IServiceB
{
   Task UploadFormData(MultipartFormDataContent formData);
}

class ServiceC
{
   async Task FetchAndUploadFiles()
   {
      var files = await GetFileListFromSomewhere();
      var formData = await _iServiceA.BuildFormData(files);
      await _iServiceB.UploadFormData(formData);
   }
}

Hier ist jetzt die Frage wie der beste Weg ist dies anzugehen:
Wenn ich das File.Delete direkt hinter den UploadFormData() packe sind die Dateien natürlich vom Prozess noch blockiert.
Für eine einzelne Datei würde ich einfach ein using-Statement für den FileStream um die Methoden setzen und danach löschen.
Wenn ich allerdings X Dateien habe ist mir nicht ganz klar wie hier der saubere weg aussieht.

Beste Grüße
emuuu

2+2=5( (für extrem große Werte von 2)

16.834 Beiträge seit 2008
vor einem Jahr

Wenn ich das File.Delete direkt hinter den UploadFormData() packe sind die Dateien natürlich vom Prozess noch blockiert.

Das hört sich eher nach einem Bug an, das sollte nicht so sein.
Ist es bei meinen Implementierungen auch nicht: ich lösche auch sofort nach dem Upload.

emuuu Themenstarter:in
286 Beiträge seit 2011
vor einem Jahr

Hab gerade festgestellt, dass MultipartFormDataContent auch IDisposable implementiert.
So funktioniert es jetzt:


   async Task FetchAndUploadFiles()
   {
      var files = await GetFileListFromSomewhere();
      using(var formData = await _iServiceA.BuildFormData(files))
     {
        await _iServiceB.UploadFormData(formData);
     }
     //delete files
   }

Schätze ich hab in meiner ersten Implementierung die einzelnen FileStreams irgendwie squishy gehandled.

2+2=5( (für extrem große Werte von 2)

16.834 Beiträge seit 2008
vor einem Jahr

Denk dran, dass es auch IAsyncDisposable gibt und damit ein await using möglich ist.
Und wenns Lib-Code ist, dann solltest Du auch ConfigureAwait(false) nutzen; so lästig es auch ist.