Laden...

Befehlszeile innerhalb Thread wird doppelt ausgeführt!

Erstellt von below vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.306 Views
B
below Themenstarter:in
114 Beiträge seit 2007
vor 16 Jahren
Befehlszeile innerhalb Thread wird doppelt ausgeführt!

Hi,

ich hänge gerade an einem kleinen Verständnisproblem und es will sich mir einfach nicht erschließen. Vorher erst einmal der grobe Aufbau der Problemfunktion.

Im MainForm wird ein Thread gestartet, der ein Com-Port Suche durchführt.

Vereinfacht:


Thread thread1 = new Thread(delegate()
{
    Search();
    Thread.CurrentThread.Abort();
}

thread1.Name = "SearchThread";
thread1.Start();


Innerhalb von Search wird nun eine Verbindung zum Com-Port anhand einiger in einer Konfigurationsdatei enthaltenen Einstellungen getestet. Schlägt der Test fehl, kann man eine neue Einstellung angeben und die Funktion Search wird erneut durchlaufen. Wenn alles funktioniert wird testweise ganze am Ende in der Konsole noch einmal der Name des aktuellen Threads ausgegeben. dabei bin ich auf einen komischen Fehler gestoßen.

Grober Aufbau von Search:


public void Search(){

if(konfig gefunden)
{
    direkte analyse
}
else
{
    comportsuche
}

# beide liefern ein ok bei gefundenem anschluss

if(ok)
{
    anschluss mit den einstellungen übernehmen, öffnen
}
else
{
    manuelle Eingabe neuer Einstellungen
    Recursive Call -> Search()
}


Console.WriteLine(CurrentThread.Name)
}


Jetzt mein Problem. Grundsätzlich funktioniert alles, der Anschluss wird gefunden und die Konfiguration gespeichert. Am Ende wird dann SearchThread in der Konsole ausgegeben.

Wenn jedoch die Einstellungen in der letzten Else Anweisung manuell eingegeben werden läuft Search zwar erneut fehlerfrei durch und findet auch den Anschluss, die Zeile mit der Konsolenausgabe wird jedoch doppelt ausgeführt! Ich komme jedoch beim besten Willen nicht darauf warum dies so ist.

183 Beiträge seit 2004
vor 16 Jahren

Durch die Rekursion.

So einfach wie möglich, aber nicht einfacher. [Albert Einstein]

take a look at
* baer-torsten.de
* codinghints

B
below Themenstarter:in
114 Beiträge seit 2007
vor 16 Jahren

Aber die wird doch gestartet bevor die Ausgabe erreicht wird. Warum werden nach einem kompletten 2. Durchlauf dann 2 Ausgaben gleichzeitig ausgegeben?

183 Beiträge seit 2004
vor 16 Jahren

Das erste erfolgt Console.WriteLine wird im rekursiven Aufruf und nach der Rückkehr aus der Rekursion in der Funktion selber.

So einfach wie möglich, aber nicht einfacher. [Albert Einstein]

take a look at
* baer-torsten.de
* codinghints

B
below Themenstarter:in
114 Beiträge seit 2007
vor 16 Jahren

Argh, ok, ich wusste nicht das der Code der der Rekursion folgt anschließend noch ausgeführt wird. Gibt es eine Möglichkeit das zu verhindern?

T
210 Beiträge seit 2006
vor 16 Jahren

Beim zweiten Aufruf wird ja irgendwann das Ende der methode erreicht und die Ausgabe findet statt. Dann kehrt die Methode zurück und du bist direkt nach der dem "zweiten Aufruf", also wieder zurück im ersten. Der läuft jetzt natürlich auch noch zu Ende...

T
210 Beiträge seit 2006
vor 16 Jahren

Original von below
Argh, ok, ich wusste nicht das der Code der der Rekursion folgt anschließend noch ausgeführt wird. Gibt es eine Möglichkeit das zu verhindern? Direkt nach der rekursiven Anwesung ein return

183 Beiträge seit 2004
vor 16 Jahren

Original von below
Argh, ok, ich wusste nicht das der Code der der Rekursion folgt anschließend noch ausgeführt wird. Ist eigentlich eine grundlegende Sache!

So einfach wie möglich, aber nicht einfacher. [Albert Einstein]

take a look at
* baer-torsten.de
* codinghints

B
below Themenstarter:in
114 Beiträge seit 2007
vor 16 Jahren

Original von él toro
Ist eigentlich eine grundlegende Sache!

Mag durchaus sein...

S
8.746 Beiträge seit 2005
vor 16 Jahren

Das Abort() ist übrigens sinnfrei. Das wird benutzt um Threads von außen abzuschiessen. Einfach die Thread-Routine auslaufen lassen.

B
below Themenstarter:in
114 Beiträge seit 2007
vor 16 Jahren

kk