2016-05-13 8 views
3

Weiß jemand, warum manchmal eine Directory.Move() Operation in C# hängt/wartet, anstatt sofort eine Ausnahme zu werfen?C# Move-Vorgang hängt, anstatt Ausnahme sofort zu werfen

Zum Beispiel:
Wenn ich die Directory.Move() Methode in einem try Block verwenden, navigieren Sie zu dem Ordner in der Datei-Explorer erstellt Windows einige Griffe Verriegelungs es.

Dann erwarte ich, dass der catch-Block sofort ausgeführt wird, aber stattdessen ist es wie die Anwendung nur für 10-15 Sekunden hängt, bevor es eine Ausnahme auslöst.

Die lustige Sache ist, dass, wenn ich außerhalb des Ordners im Datei-Explorer während dieser 10-15 Sekunden gehen, dann die Anwendung tatsächlich die Move() Operation abgeschlossen.

Es ist wie: Anstatt eine Ausnahme sofort zu werfen, hängt Windows 10-15 Sekunden, um zu sehen, ob die Personen, die für die Handles (Sperren) verantwortlich sind, diese Handles selbst schließen.

Gibt es eine Möglichkeit, die Anwendung sofort die Ausnahme zu werfen?

+0

können Sie einen Code bereitstellen? – Usman

+0

Das klingt wie Windows versucht, fehlgeschlagen, warten und erneut versuchen, bevor die Ausnahme – Shon

+1

wirft es scheint es wartet einfach auf die Dateiobjekt-Handles entsperrt werden. Wenn Datei/Ordner "in Verwendung" ist, ist sie nicht löschbar, aber Sie können nie garantieren, dass die Plattform sofort abbricht. es kann einen Moment warten und erst nach einer gewissen Zeit abbrechen. Ich bin ziemlich sicher, dass hängt von der Windows-Version, Dateisystem-Typ, Registry-Treiber-Einstellungen, und - auch - jede aufdringliche Software wie Antivirenprogramme/Beobachter/Monitore/etc können auch das beeinflussen – quetzalcoatl

Antwort

0

Die Antwort auf Ihre Frage "Weiß jemand, warum manchmal ein Verschiebevorgang in C# hängt/wartet, anstatt sofort eine Ausnahme auszulösen?" ist wahrscheinlich, dass das .net-Framework mit einem ausstehenden Status von seiner Anforderung für eine NTFS-Sperre ausgegeben wird und schließlich aufgibt.

Das System.IO.Directory.Move wird direkt einer Kernel32-Funktion zugeordnet; Ich nehme an, dass dies schliesslich LockFileEx (https://msdn.microsoft.com/en-us/library/windows/desktop/aa365203(v=vs.85).aspx) aufruft, was dem Anrufer erlaubt zu spezifizieren, ob er sofort fehlschlägt, wenn die Sperre nicht erreicht werden kann, oder auf eine bestimmte Zeit warten kann. Ich nehme an, dass Kernel32 die Variante verwendet, die das Setzen eines Timeouts erlaubt. Es scheint nicht, dass das .net-Framework einen Einfluss darauf hat, welches Timeout es verwendet hat.

Verwandte Themen