Laden...

der prozess kann nicht auf die datei zugreifen, da sie von einem anderen prozess verwendet wird.

Erstellt von talha vor 7 Jahren Letzter Beitrag vor 7 Jahren 13.006 Views
T
talha Themenstarter:in
10 Beiträge seit 2016
vor 7 Jahren
der prozess kann nicht auf die datei zugreifen, da sie von einem anderen prozess verwendet wird.

Hi Leute, bin kein erfahrener Programmierer und brauche mal Hilfe bei dieser Fehlermeldung. Hab schon versucht eine Lösung zu finden und die meisten Lösungen waren dispose() zu benutzen bzw. using, was ich bereits mache. Was auch kurios ist, ist dass es manchmal trotzdem klappt mehrmals in die Textdatei zu schreiben.

Also ich habe zwei Stellen, wo ich in eine Textdatei schreiben möchte. Hab mal nur das wesentliche aufgeschrieben, damit es übersichtlicher bleibt. Ich habe ein Start-Button, die ich am Anfang jedes Durchlaufs aufrufe und eine Funktion die durch ein Event aufgerufenwird, wenn sich die Werte ändern.


void rateChanged(object sender, ChangeEventArgs e)
{ 
   if (currentValue != 0)
   {
                ValueText = currentValue .ToString();
                using (StreamWriter file = new StreamWriter(@"C:\Users\Desktop\ValueText.txt", true))
                {
                    file.WriteLine(ValueText );
                }
   }
}

private void Button_Start(object sender, RoutedEventArgs e)
{
   using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\Users\Desktop\ValueText.txt", true))
   {
                file.WriteLine("Nächster Versuch " + Environment.NewLine);
        
   }
}


Wenn ich ein zweites mal auf ein Start-Button klicke, um den Vorgang zu wiederholen, kommt die Fehlermeldung > Fehlermeldung:

Der Prozess kann nicht auf die Datei "C:\Users\Desktop\Values.txt" zugreifen, da sie von einem anderen Prozess verwendet wird

16.834 Beiträge seit 2008
vor 7 Jahren

Streams sind Ressourcen (bzw. die Handles davon), die verworfen werden müssen, wenn sie nicht mehr benötigt werden.
Ansonsten passiert genau das.

Edit nach Deinem Edit:
beide Codestellen verwerfen Deine StreamWriter korrekt.
Sicher, dass das der vollständig relevante Code ist?
Hast Du die Datei sicher nicht zB. mit Notepad noch versehentlich offen?
Sicher, dass kein anderes Handle (zB. von vorherigem, falschen Code) auf der Datei sitzt?

T
talha Themenstarter:in
10 Beiträge seit 2016
vor 7 Jahren

beide Codestellen verwerfen Deine StreamWriter korrekt.
Sicher, dass das der vollständig relevante Code ist?
Hast Du die Datei sicher nicht zB. mit Notepad noch versehentlich offen?
Sicher, dass kein anderes Handle (zB. von vorherigem, falschen Code) auf der Datei sitzt?

Wie gesagt, war auch der Meinung, dass die Fehlermeldung nicht auftreten sollte, wenn using benutz wird. Tut es aber.

Und ich bin mir sicher, dass das ich nur an diesen beiden Stellen auf die Datei zugreife. Wenn ich eins der beiden auskommentiere klappt es nämlich.

Ich gehe mal nochmal drüber um zugucken, was noch relevant sein könnte. Ich habe in der funktion rateChanged nämlich auch ein Dispatcher, wo ich einige der Werte auf der Oberfläche ausgebe. Hatte zunächst das beschreiben der Datei auch im Dispatcher und da gab es keine Fehlermeldung, aber dafür hing die Oberfläche bisschen.

96 Beiträge seit 2012
vor 7 Jahren

Ist es möglich, dass die Methode "rateChanged" ausgelöst wird, wenn du auf den Button drückst, also beide Methoden zeitgleich agieren?


Gruß
Carlo

"Palabras que no coinciden con hechos no valen nada."

T
talha Themenstarter:in
10 Beiträge seit 2016
vor 7 Jahren

Nein - Definitiv nicht

Edit: Also es sind definitv verschiedene Events, aber ratechanged wird sehr oft und schnell aufgerufen. Könnte das Probleme bereiten?

16.834 Beiträge seit 2008
vor 7 Jahren

Naja. Der Code den Du hier zeigst, kann nicht den Fehler auslösen - außer, es gibt externe Handles zB. durch Notepad o.ä oder die Ausführung findet parallel statt.

aber ratechanged wird sehr oft und schnell aufgerufen. Könnte das Probleme bereiten?

Natürlich.
Dann bräuchtest Du einen Locking Mechanismus.

Wobei es nicht sonderlich schlau ist Dateien ständig zu öffnen und wieder zu schließen, wenn das sehr schnell und andauernd erfolgt.
Dann solltest Du Dir einen Caching Mechanismus einfallen lassen.

709 Beiträge seit 2008
vor 7 Jahren

Durch welche Ereignisse welcher Steuerelemente werden denn die Handler aufgerufen?

T
talha Themenstarter:in
10 Beiträge seit 2016
vor 7 Jahren

Ich bereite kurz was vor und kopiert dann mehr vom Code

1.029 Beiträge seit 2010
vor 7 Jahren

Hi,

wenn du einen Dispatcher verwendest - dann verwendest du sicher auch MultiThreading, womit die Methode rateChanged vll 2 mal gleichzeitig ausgeführt wird.

In dem Fall solltest du mal das Thema Multithreading - bzw. locking für den Anfang anschauen...

LG

T
talha Themenstarter:in
10 Beiträge seit 2016
vor 7 Jahren

Das ist die eigentliche rateChanged Funktion. Wollte es eigentlich klein halten.

void supervisor_RateChanged(object sender, MaskEventArgs e)
        {           
            ///aktuelle Werte der Instance nehmen 
            var currentRawValue = supervisor.RawValue;           
            var currentFilteredValue = supervisor.FilteredValue;
            var currentHeartValue = supervisor.CurrentHeartRate;


            Application.Current.Dispatcher.Invoke((Action)(() =>
                {
                    //Zeitstoppen bei erster Aenderung von RawValue 
                    textAenderung.IsReadOnly = true;
                    textAenderung.Text = timeBisAenderungText;

                    //Ausgabe von MaskState bei Aenderungen (ausser Pending) und die Zeit bis dahin
                    textErgebnis.IsReadOnly = true;
                    textErgebnis.Text = timeBisErgebnisText;
                    
                    
                    //Ausgabe von heartRate bei Aenderungen und die Zeit bis dahin
                    textHr.IsReadOnly = true;
                    heartRateText = currentHeartValue.ToString();
                    textHr.Text = heartRateText;

                    //Ausgabe RawValue
                    textRv.IsReadOnly = true;
                    rawValueText = currentRawValue.ToString();
                    textRv.Text = rawValueText;


                }));
            #region In File schreiben
            //Erste Aenderung
            if (currentRawValue != 0 && firstChange == true)
            {
                timeBisAenderungText = viewModel.Time.ToString();
                //textAenderung.Text = timeBisAenderungText;
                using (System.IO.StreamWriter file =
                new System.IO.StreamWriter(@"C:\Users\talha\Desktop\MODI\Tests\Outputs\Additional.txt", true))
                {
                    file.WriteLine("Zeit bis erste Aenderung: " + timeBisAenderungText);
                    
                }
                firstChange = false;
            }
            //Erstes Ergebnis, Welches MaskState(ausser Pending)
            if (/*e.MaskState != 0 &&*/ maskStateChanged != (int)e.MaskState)//pending=0 mask=1 face=2
            {
                timeBisErgebnisText = viewModel.Time.ToString();
                maskStateChanged = (int)e.MaskState;
                maskStateText = e.MaskState.ToString();
                using (System.IO.StreamWriter file =
                new System.IO.StreamWriter(@"C:\Users\talha\Desktop\MODI\Tests\Outputs\Additional.txt", true))
                {
                    if (maskStateText != "Pending")
                        file.Write("Ergebnis: " + maskStateText + "\t Zeit bis Ergebnis: " + timeBisErgebnisText + Environment.NewLine);
                }
            }
            //Heartrate und Zeit bis Aenderung
            if (currentHeartValue != 0 && HearRateChanged != heartRateText)
            {
                HearRateChanged = heartRateText;
                using (System.IO.StreamWriter file =
                new System.IO.StreamWriter(@"C:\Users\talha\Desktop\MODI\Tests\Outputs\Additional.txt", true))
                {
                    file.Write("Heartrate: " + heartRateText + " Zeit bis Heartrate: " + viewModel.Time.ToString() + Environment.NewLine);
                }

            }
            //RawValue
            if (currentRawValue != 0)
            {
                using (StreamWriter file =
                new StreamWriter(@"C:\Users\talha\Desktop\MODI\Tests\Outputs\RawValues.txt", true))

                {
                    file.WriteLine(rawValueText);
                }
            }
            //FilteredValue
            if (currentFilteredValue != 0)
            {
                filteredValueText = currentFilteredValue.ToString();
                using (StreamWriter file =
                new StreamWriter(@"C:\Users\talha\Desktop\MODI\Tests\Outputs\FilteredValues.txt", true))
                {
                    file.WriteLine(filteredValueText);
                }
            }
            #endregion
            Debug.Print(string.Format("Zeit bis anderes Ergebnis {0}", viewModel.Time));
            Debug.Print(string.Format("----Zeit bis Aenderung {0}", timeBisAenderungText));

Und hier der Start-Button

  private void Button_Start(object sender, RoutedEventArgs e)
        {
            frameRateProviderSupervisor.IsEnabled = true;
            Time = 0;
            stopwatch.Restart();
            timer.Start();

        //    supervisor.resetMaskState();
            index = 0;
            average = null;
            for (int i = 0; i < rawValues.Count; i++)
            {
                rawValues[i] = 0;
                filteredValues[i] = 0;
                //pointCollection2.Clear();
            }
            //rawPointCollection.Clear();
            //pointCollection1.Clear();
            //filteredFFTPointCollection.Clear();
            //rawFFTPointCollection.Clear();

           

            //plot.InvalidatePlot();
            //plot2.InvalidatePlot();
            //plotfftFilter.InvalidatePlot();
            //plotfftRaw.InvalidatePlot();

            imageProvider.Start();
            viewModel.Start();

            //Beim StartButton Textzeite in Textdatei einfuegen
           
            sStartCounter = startCounter.ToString();
            using (System.IO.StreamWriter file =
                new System.IO.StreamWriter(@"C:\Users\talha\Desktop\MODI\Tests\Outputs\FilteredValues.txt", true))
            {
                file.WriteLine(Environment.NewLine + "--------------- " + sStartCounter + ". Start ---------------");
        

            }
            using (System.IO.StreamWriter file =
                new System.IO.StreamWriter(@"C:\Users\talha\Desktop\MODI\Tests\Outputs\RawValues.txt", true))
            {
                file.WriteLine(Environment.NewLine + "--------------- " + sStartCounter + ". Start ---------------");


            }
            using (System.IO.StreamWriter file =
                new System.IO.StreamWriter(@"C:\Users\talha\Desktop\MODI\Tests\Outputs\Additional.txt", true))
            {
                file.WriteLine(Environment.NewLine + "--------------- " + sStartCounter + ". Start ---------------");

            }
            Debug.Print(string.Format("Start Nummer: {0}", startCounter));
            startCounter++;
            
        }

**
Und wie gesagt wenn ich alles was in der region In File schreiben steht in den Dispatcher packe, klappt es... Ich kann es mir nicht erklären**

T
talha Themenstarter:in
10 Beiträge seit 2016
vor 7 Jahren

In dem Fall solltest du mal das Thema Multithreading - bzw. locking für den Anfang anschauen...

Ja muss gestehen, dass ich mich mit Multithreading überhaupt nicht auskenne. Habdie Lösung aus dem Netz kopiert und für mich angepasst. Würde gerne das erstmal zum Laufen bringen und dann muss ich mir das auf jeden Fall noch genauer angucken.

16.834 Beiträge seit 2008
vor 7 Jahren

Du hast mehrere Threads, die dann zeitgleich auf eine Datei zugreifen.
Ohne Locking knallts.

Multi Threading muss man im Griff haben.
[Artikel] Multi-Threaded Programmierung
Nur kopieren ohne verstehen ist immer ein Risiko; bei Threads eine Garantie für Probleme.

Schreib die eine entsprechende Klasse, die das Locking pro Datei übernimmt und seriell statt parallel die Dateien schreibt.

T
talha Themenstarter:in
10 Beiträge seit 2016
vor 7 Jahren

Danke für den Link Abt und danke auch an alle anderen.

Multithreading scheint aber ein bisschen umfangreicheres Kapitel zu sein. Die Dokumentation bei dem Link hat ja 30 Seiten.

Könnte mir wer damit helfen, es für meine Situation jetzt zu benutzen. Würde nur ungern das Programm "kaputt" liegen lassen, bis ich mich Multithreading beschäftigt habe

T
talha Themenstarter:in
10 Beiträge seit 2016
vor 7 Jahren

Nur kopieren ohne verstehen ist immer ein Risiko; bei Threads eine Garantie für Probleme.

Das ist ein schöner Zitat! Ich stimme dir ja auch zu, aber wenn man als Anfänger erst mal alles verstehen will, bevor man was benutzt, ist man die meiste Zeit über mit Tutorials und Lernen beschäftigt und kommt nicht zur wesentlichen Arbeit. 😭

16.834 Beiträge seit 2008
vor 7 Jahren

..und wenn man Zeugs kopiert und dann auf (hausgemachte) Probleme trifft, dann kann man sie nicht eigenständig lösen, da man es nicht versteht.
Bei gewissen Sachen funktioniert Try-n-Error, da stimm ich Dir zu und befürworte auch in einigen Fällen das Autodidaktische; bei Threads aber definitiv das falsche Vorgehen.

T
talha Themenstarter:in
10 Beiträge seit 2016
vor 7 Jahren

Okay danke sehr. Ich kopier die Sachen aus der #region "In File schreiben" mal vorübergehend in den Dispatcher und gucke mir morgen früh mal Multithreading an.

Früher oder Später müsste ich es ja eh machen =)

W
872 Beiträge seit 2005
vor 7 Jahren

Ich habe eher das Gefühl, daß Du mit der Datei eine Art Logging machen willst.
Würde an Deiner Stelle mal anschauen, ob es nicht einfacher wäre, daß Du log4Net, NLog oder etwas anderes nimmst.

T
talha Themenstarter:in
10 Beiträge seit 2016
vor 7 Jahren

Ich habe eher das Gefühl, daß Du mit der Datei eine Art Logging machen willst.
Würde an Deiner Stelle mal anschauen, ob es nicht einfacher wäre, daß Du log4Net, NLog oder etwas anderes nimmst.

Das sagt mir ja mal überhaupt nichts 😕 Kannst du es vielleicht etwas genauer erläutern

16.834 Beiträge seit 2008
vor 7 Jahren

Das sind übliche Logging Projekte.
Bitte Google danach und schau sie Dir an.

2.207 Beiträge seit 2011
vor 7 Jahren

Hallo talha,

was logging ist? oder was die Stichwörter bedeuten? Beides kannst du sehr gut googeln.

Gruss

Coffeebean