2017-11-05 4 views
-1

I 1 Sperrobjekt zu verwenden, versuchen und versuche, auf die gleiche Datei an zwei verschiedenen Orten unter dem Schloss mit Stream zu schreiben, aber ich erhalte den Fehler :Der Prozess kann nicht auf diese Datei zugreifen, da sie von einem anderen Prozess in C# verwendet wird

Der Prozess kann die Datei ‚Dateiname‘ nicht zugreifen, da sie von einem anderen Prozess verwendet wird.

Lock-Objekt definiert sind, verwendete ich ein statisches Objekt:

protected static Object Semaphore = new Object(); 

if(x != null) 
{ 
    lock (Semaphore) 
    { 
     using (StreamWriter sw = new StreamWriter(fileName)) 
     { 

      sw.WriteLine(a + "," + b + "," + c); 
      sw.Close(); 
      sw.Flush(); 
     } 
    } 

} 

Gleich nach dieser:

if(y != null) 
{ 
    lock (Semaphore) 
    { 
     using (StreamWriter sw1 = new StreamWriter(fileName)) 
     { 

      sw1.WriteLine(a + "," + b + "," + c); 
      sw1.Close(); 
      sw1.Flush(); 
     } 
    } 
} 

Was bin ich? Vielen Dank.

+0

Sie müssen zeigen, wie Sie diesen Code verwenden, denn das ist der wichtige Teil ist. – CodingYoshi

+0

Keine Notwendigkeit zum Schließen und Spülen in diesem Code. mit dem Stream entsorgen und das wird spülen und es schließen –

+1

Sie wirklich ein [MCVE] für uns, dieses Problem zu sehen in Aktion zur Verfügung stellen müssen. Im Moment sieht dein Code gut aus, also gibt es nichts, was wir beantworten können. – Enigmativity

Antwort

0

Die Datei wird nach wie vor als „in Gebrauch“ von Ihrem Betriebssystem markiert - die Fehlermeldung nicht von Ihrem Semaphor-Mechanismus ist. Normalerweise würde ich denken, dass die Semaphore in Kombination mit der Verwendung sollte die Datei für gut schließen.

Welcher der 2 Codeteile löst Ihre Ausnahme aus? Öffnest du es woanders?

Btw. Bitte kopieren Sie & einfügen/Fix Ihren Code - Ihr eingefügtem Demo-Code wird nicht ausgeführt - geschlossen Textwriter können nicht geleert werden!

MY Testfall - noch nicht mit Gewinde:

internal class Program 
{ 
    public static void DoStuff() 
    { 
     Directory.CreateDirectory(Path.GetDirectoryName(fileName)); 

     if (x != null) 
     { 
      lock (lockObj) 
      { 
       WriteStuff(); 
      } 
     } 

     if (y != null) 
     { 
      lock (lockObj) 
      { 
       WriteStuff(); 
      } 
     } 
    } 


    private static string fileName = "C:\\temp\\tempfile.txt"; 
    private static object lockObj = new object(); 
    private static string x = ""; 
    private static string y = ""; 

    static void Main(string[] args) 
    { 
     DoStuff(); 
    } 

    static void WriteStuff() 
    { 
     using (StreamWriter sw1 = new StreamWriter(fileName)) 
     { 
      sw1.WriteLine("irrelevant"); 
     } 
    } 
} 
Verwandte Themen