Anwendung auf Thread warten lassen

The_Maegges

Erfahrenes Mitglied
Hallo mal wieder!

Ich schreibe gerade ein Programm, welches eine eMail mit fortlaufender Nummer generiert, welche in einer Datei abgelegt wird bzw. daraus ausgelesen wird.

Da diese Datei nicht gelesen wurde, wenn man einen grösseren Dateianhang anhängt, habe ich im Form der Anwendung einen Thread programmiert, welcher diese Datei ausliest.
Das funktioniert auch mit grösseren Anhängen zusammen.
Das Problem ist aber, dass der Thread oft nicht schnell genug fertig ist, da das auslesen der Datei offensichtlich mehr Zeit beansprucht, als die restliche Ausführung.

Gibt es eine Möglichkeit, die Methode, die diese Nummer benötigt auf das Beenden des Threads warten zu lassen (in dieser Methode starte ich den Thread auch, was wichtig ist, da diese Nummer immer die aktuellste Nummer sein muss und ich den Zugriff auf diese Nummer so kurz wie möglich gestalten muss, ein Einlesen der Nummer z.B. bei Programmstart ist keine annehmbare Option).

Dass das Performancetechnisch eine Bremse ist, ist mir durchaus bewusst, aber das ist für die Anwendung vereinbar, da der Thread nicht aus Performancegründen läuft, sondern um den zeitlich parallelen Zugriff auf zwei Dateien (Anhang und Nummerablage) zu ermöglichen.

Wäre für jeden Tipp dankbar!

Beste Grüsse,
The_Maegges
 
Danke schonmal für die Info!

Leider funktioniert es noch nicht ganz so, wie ich mir das vorstelle.
Das Problem ist, dass die Ausführung des Threads bei der ersten Ausführung die Variable nicht ändert. Erst die zweite Ausführung der Debug Funktion (der Aufruf in der eigentlichen Funktion geschieht genauso) lädt die Variable korrekt.

Ich hab mir mal ne Fkt zu Debugzwecken geschrieben:

Code:
private void pictureBox1_Click(object sender, EventArgs e)
        {
            filethread = new Thread(new ThreadStart(ReadDataInThread));

            if (filethread.ThreadState == ThreadState.Unstarted)
            {
                filethread.Start();
                filethread.Join();
            }
            if (filethread.ThreadState == ThreadState.Stopped)
            {
                filethread = new Thread(new ThreadStart(ReadDataInThread));
                filethread.Start();
                filethread.Join();
            }
            MessageBox.Show(myRunNumber.ToString() + " Runnumber");
        }

Und hier noch der Code zum Thread:

Code:
public void ReadDataInThread()  
        {
            StreamReader r = new StreamReader("bamf.rnr");
            int internalrnr = (int.Parse(r.ReadLine()));
            r.Close();
            delsetmyRunNumber delsetRNR = new delsetmyRunNumber(this.setmyRunNumber);
            this.BeginInvoke(delsetRNR,  new object[] { internalrnr });
        }
    
        
        delegate void delsetmyRunNumber(int number);
        public void setmyRunNumber(int number)
        {
            this.setPgRunNumber(number);
        }
 
Hi

Welche Variable wird wo nicht geändert? :confused:
Schon mal einen Breakpoint an die entsprechende Stelle gesetzt, und überprüft, ob der entsprechende Wert auch gesetzt wird?
Kommt die Abfrage ggf. vor dem Setzen?
 
Es gibt eine globale Variable myRunNumber.
diese wird vom Thread durch den Aufruf der Funktion this.setPgRunNumber(number); geändert.
Alternativ habe ich auch schon eine direkte Änderung in der delegierten Funktion "setmyRunNumber" versucht.

Ich habe in der delegierten Fkt auch MessageBoxen ausgeben lassen, um den Inhalt der Variable auszugeben.

Dort besitzt die Variable auch den korrekten Wert.
Die Ausgabe der globalen Variable in der Debugfunktion ist aber trotzdem nach dem ersten Lauf "0".
Erst nach dem zweiten Lauf hat die globale Variable den korrekten Wert, der in der Datei "bamf.rnr" steht.
 
Zurück