Prüfe, ob eine Datei asynchron ist?

8

Ich wünschte, es gäbe ein File.ExistsAsync()

Ich habe:

%Vor%

Das Benutzen eines Threads fühlt sich an wie ein Antipattern. Gibt es einen saubereren Weg?

    
Johan Larsson 29.09.2013, 09:55
quelle

2 Antworten

2

Aus gutem Grund gibt es kein File.ExistsAsync; weil es keinen Sinn macht, einen zu haben; File.Exists wird nicht sehr lange dauern; Ich habe es als 0,006255 ms getestet, wenn die Datei existiert und 0,010925 ms, wenn die Datei nicht existiert.

Es gibt einige Male, wenn es sinnvoll ist, File.Exists aufzurufen; aber normalerweise denke ich, dass es die richtige Lösung wäre, die Datei zu öffnen (und somit das Löschen zu verhindern) und irgendwelche Ausnahmen abzufangen - da es keine Garantie gibt, dass die Datei nach dem Aufruf von File.Exists weiter bestehen wird.

Wenn Sie eine neue Datei erstellen und die alte nicht überschreiben möchten:

%Vor%

Für die meisten Anwendungsfälle kann ich mir File.Open () vorstellen (ob für existierende oder neue), denn sobald der Aufruf erfolgreich ist, haben Sie einen Griff zur Datei und können etwas tun damit. Selbst wenn ich die Existenz der Datei als Flagge benutze, würde ich sie trotzdem öffnen und schließen. Die einzige Zeit, in der ich File.Exists wirklich benutzt habe, ist die Überprüfung, ob vor dem Aufruf des Browsers eine lokale HTML-Datei vorhanden ist, so dass ich eine nette Fehlermeldung anzeigen kann, wenn dies nicht der Fall ist.

Das ist keine Garantie, dass etwas anderes die Datei nicht nach File.Exists löscht; Wenn Sie es nach dem Überprüfen mit File.Exists geöffnet haben, könnte der offene Anruf dennoch fehlschlagen.

Bei meinen Tests dauert die Verwendung eines FileExists auf dem Netzwerklaufwerk länger als File.Open, File.Exists dauert 1,5967ms, während File.OpenRead 0,3927ms dauert)

Vielleicht, wenn Sie darüber nachdenken könnten, warum Sie das tun, könnten wir besser antworten; Bis dahin würde ich sagen, dass du das nicht tun solltest

    
Richard Harrison 29.09.2013, 10:51
quelle
3

Es gibt keinen saubereren Weg als Ihre Lösung.

Abgesehen von den Problemen der Rennbedingungen glaube ich, dass Ihre Lösung in einigen Situationen verwendet werden kann. z.B.

Ich habe statischen Dateiinhalt in vielen verschiedenen Ordnern. (in meinem Fall cshtml Ansichten, Skriptdateien, CSS-Dateien, für mvc) Diese Dateien (die sich während der Ausführung der Anwendung nicht viel ändern) werden immer bei jeder Anfrage an den Webserver überprüft. Aufgrund meiner Anwendungsarchitektur gibt es mehr Orte, auf die Dateien geprüft werden als in der Standard-mvc-Anwendung. So sehr, dass file.exists für jede Anfrage einen großen Teil der Zeit beansprucht.

damit werden Race Conditions im Allgemeinen nicht passieren. Die einzige interessante Frage für mich ist Leistung

Das Starten einer Task mit Task.Factory.StartNew () dauert 0,002 ms (Quelle Warum so viel Unterschied in der Leistung zwischen Thread und Task? )

Aufruf von Datei.exists dauert "0,006255 ms, wenn die Datei existiert und 0,010925 ms, wenn die Datei nicht existiert." [Richard Harrison]

also durch einfache Mathematik Aufruf der async File.Exists dauert 0,008 ms bis zu 0,012 ms

im besten Fall async File.Exists dauert 1,2-mal so lange wie File.Exists und im schlimmsten Fall dauert es 1,3-mal so lange. (In meinem Fall sind die meisten Pfade, die gesucht werden, nicht vorhanden), so dass die meiste Zeit eine Datei.Exists meistens nahe bei 0,01 ms ist

Es ist also nicht so viel Overhead, und Sie können mehrere Kerne / Festplattencontroller usw. effizienter nutzen. Mit diesen Berechnungen können Sie sehen, dass asynchron das Vorhandensein von 2 Dateien überprüft, dass Sie im schlimmsten Fall (0,02 / 0,012)

bereits eine Leistungssteigerung von 1,6 haben

Nun, ich bin nur asyning async File.Exists ist es wert in bestimmten Situationen.

Vorbehalte meines Posts: Ich habe vielleicht nicht alles richtig berechnet Ich habe viel gerundet Ich habe die Leistung auf einem einzelnen PC nicht gemessen Ich nahm Leistung von anderen Pfosten Ich habe gerade die Zeit von File.Exists und Task.Factory.StartNew () hinzugefügt (dies mag falsch sein) Ich vernachlässige viele Nebeneffekte von Multithreading

    
toeb 15.12.2013 16:33
quelle

Tags und Links