2017-12-11 5 views
0

Auf meiner Web-API möchte ich einen Ordner nach meiner Rückkehr-Anweisung löschen.Code nach der Rückgabe ausführen

public string Post(HttpRequestMessage request) 
{ 
    //Do cool stuff with request 
    try 
    { 
     return "10.0.2.2:8080/myFolder/index.html"; 
    } 
    finally 
    { 
     Thread.Sleep(60000); 
     Directory.Delete(myFolder, true); 
    } 
} 

Was ich erwartet hatte, ist, dass das Gerät die POST machen könnte die return-Anweisung und laden Sie die html Datei. Nach einer Minute löschen wir diese Datei, um Speicherplatz auf dem Server freizugeben.

Was passiert ist, dass die Rückgabeanweisung tatsächlich nach der finally-Anweisung gesendet wird.

Wie kann ich Code nach einer Rückgabeanweisung mit Verzögerung ausführen, ohne die Rückgabe zu verzögern?

+0

Dinge, die Sie zu tun versuchen, ist nicht möglich, Prozess der Betrieb von der Aufruf Methode, nach Erhalt der Antwort –

+0

Ich kann keine asynchrone Aufgabe mit einem 'thread.sleep' darin erstellen? Oder Sie sagen mir, dass ich das Gerät brauche, um einen DELETE-Aufruf an die Web-API zu senden? – BeGreen

+1

Sobald Sie es zurückgegeben haben, ist die Methode beendet. Sie können eine Aufgabe mit 'Task.Delay (60000)' starten. – FCin

Antwort

3

Es gibt keine Möglichkeit, das zu tun, und es wäre sowieso schlecht, da Sie Ressourcen (Webserver Threads zum Beispiel) beschäftigt warten würde.

Schreiben Sie einen anderen Prozess (vorzugsweise einen Windows-Dienst, wenn Sie unter Windows sind), der das Verzeichnis regelmäßig überprüft und alle Dateien eines bestimmten Alters löscht.

+0

Es ist die Art, wie es läuft. Aber die Leute lesen keine Dokumentation und vergessen diese Aufgabe, sie haben einen neuen Server eingerichtet. – BeGreen

+2

@BeGreen Dann machen Sie es offensichtlicher (Hinweis) oder einfacher zu erreichen (Einstellungen). Wenn es existiert, aber die Leute es nicht benutzen, weil sie es nicht wissen (oder vergessen), ist es ein Usability-Problem. –

+0

Nun, "es gibt keinen Weg" ist meiner Meinung nach nicht wirklich wahr. Sie können beispielsweise Hintergrundarbeiten in der Hosting-Umgebung in die Warteschlange stellen. Aber da dies fortgeschrittene Kenntnisse erfordert (d. H. Ausnahmebehandlung usw.), füge ich dies nicht als zusätzliche Antwort hinzu. Nichts für ungut (wirklich! Jeder fängt irgendwie an), aber ich denke, dass jemand, der einen Rat braucht, wie 'try..finally' funktioniert, sollte stattdessen beim Refactoring bleiben. Wie auch immer, [dieser Beitrag] (https://stackoverflow.com/questions/14710822/how-to-queue-background-tasks-in-asp-net-web-api) könnte ein guter Ausgangspunkt für weitere Lektüre sein. – Peit

0

Sie nicht Code nach der Rückkehr meiner Meinung nach ausführen können, können Sie Dateien überprüfen, ob die Datei vor 1m erstellt löschen

DirectoryInfo objDirectoryInfo = new 
       DirectoryInfo(Server.MapPath("~/files")); 
foreach (FileInfo File in objDirectoryInfo.GetFiles) { 
    if ((File.LastAccessTime < DateTime.Now.AddMinutes(-1))) { 
     File.Delete(); 
    } 
} 
Verwandte Themen