Frage

HINTERGRUND: Ich benutze einen in eine Datei-Offset und der Filestream-lock / menthods entsperren lesen steuern / Schreibzugriff. Ich verwende den folgenden Code zu testen, ob eine Sperre zur Zeit auf der Datei gehalten wird

try
{
  fs.Lock( RESERVED_BYTE, 1 );
  fs.Unlock( RESERVED_BYTE, 1 );
  rc = 1;
}
catch
{ 
  rc = 0; 
}

FRAGE:
Mein Ziel ist es, den try / catch-Block zu beseitigen. Gibt es einen besseren Weg, um zu sehen, ob die Verriegelung vorhanden ist?

EDIT:
Hinweis: Diese Frage ist nicht etwa, wenn die Datei vorhanden ist. Ich weiß schon, es tut. Es handelt sich um den Schreibzugriff synchronisiert wird.

War es hilfreich?

Lösung

können Sie rufen die LockFile Windows-API Funktion durch die P / Invoke Schicht direkt. Sie würden den Griff von der Safefilehandle-Eigenschaft auf dem Filestream zurück verwenden.

Der Aufruf der API direkt ermöglicht es Ihnen, den Rückgabewert für einen Fehlerzustand zu überprüfen, wie zu fangen eine Ausnahme Zuflucht gegenüber.


Noah fragt, ob es bei der Herstellung der Aufruf der P jede Overhead / Invoke Schicht vs einem try / catch.

Die Sperrdatei macht den gleichen Anruf durch die P / Schicht Invoke und wirft die Ausnahme, wenn der Anruf an LockFile 0. In Ihrem Fall gibt, werden Sie eine Ausnahme nicht zu werfen. Für den Fall, die Datei gesperrt ist, werden Sie weniger Zeit in Anspruch nehmen, weil Sie nicht mit einem Stapel Abroller handeln.

Der tatsächliche P / Invoke-Setup ist um sieben Befehle Ich glaube (zum Vergleich: COM-Interop etwa 40 ist), aber dieser Punkt ist strittig, da Ihr Anruf LockFile wird das gleiche tun, dass die verwaltete Methode macht (verwenden Sie die P / Invoke-Schicht).

Andere Tipps

Persönlich würde ich nur eine gesperrte Datei fangen, wenn sie versuchen, es zu öffnen. Wenn es jetzt freigeschaltet wird, kann es verriegelt werden, wenn Sie versuchen, es zu öffnen (auch wenn es später nur ein paar ms ist).

  

Mein Ziel ist es, die try / catch-Block

zu beseitigen

Denken Sie daran, das Dateisystem volatile : Nur weil Sie Ihre Datei in einem Zustand für eine Operation ist, bedeutet nicht, es im gleichen Zustand für die nächste Operation sein wird. Sie müssen in der Lage, Ausnahmen aus dem Dateisystem zu behandeln.

Unter bestimmten Umständen auch WCT , ist es in der Regel durch Debugger oder Profilometer implmented, aber es kann von jedem beliebigen Code als die übliche Debugger Anforderung des Gewinde, die die offenen Debug-Port verwendet wird, ist kein Pre-Requisit. Als solche WCT ist eine sehr umfassende und genaue Informationen über Sperrenkonflikte.

verwaltet Beispiel (all-sein-es etwas Trickey ), zeigt die Nützlichkeit für diese spezifische Untergruppe des nativen Debug-API auf der CLR.

Ich glaube nicht, es möglich ist, ohne Versuch, zu fangen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top