Entwickler-Ecke
Basistechnologien - Keine Reaktion bei TPL-Consolen-Programm
Luccas - Di 09.08.16 16:01
Titel: Keine Reaktion bei TPL-Consolen-Programm
Hallo zusammen
Bin neu hier und wünsche allen gutes Gelingen!
Ich hoffe, ich bin im richtigen Themenbereich gelandet.
Bin gerade dabei, mich in asynchrone Programmierung mit TPL einzuarbeiten und schon gleich das erste Beispiel will einfach nicht funktioniert.
Das Beispiel stimmt mit zwei Beispielen aus Lehrbüchern (im Prinzip) überein, liefert aber keine Ausgabe auf der Console (Starten ohne Debugging).
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| static void Main(string[] args) { Task TaskObj = new Task(SubRoutine); TaskObj.Start(); }
static void SubRoutine() { Console.Write("\n Start Sub-Thread\n"); int i; for (i = 1; i <= 10; i++) { Console.Write(" S:{0}", i); Thread.Sleep(500); } Console.Write("\n Ende Sub-Thread\n"); Console.Write("\n\n"); } |
Der gleiche Fehler-Effekt wenn ich das Ganze mit Lambda-Ausdruck startet. Auch das Original MS-Hilfe Beispiel liefert keine Ausgabe. Natürlich sind alle Programm syntaktisch korrekt - also keine Fehlermeldungen. Liegt nicht am Computer, habe es auf 3 versch. Rechner probiert.
So ratlos war ich schon lange nicht mehr. Hat jemand eine Idee. Danke im Voraus.
Luccas
Delete - Di 09.08.16 16:16
- Nachträglich durch die Entwickler-Ecke gelöscht -
Luccas - Mi 10.08.16 10:55
Hallo
Danke für die Antworten.
leider nein, ich übersetze grundsätzlich Konsolen-Progamme "ohne Debugging" (das Konsolenfenster bleibt nach der Ausgabe stehen). Einfügen von Console.ReadLine (oder ReadKey) sind wirkungslos. Eine Dummy-Konsolenausgabe in Main()-Teil wird anstandslos ausgeführt.
Mit Task.Wait() sehe ich zwar die Ausgabe, verstehe aber den Vorgang trotzdem nicht (und das würde ich gern). Wenn ohne Task.Wait() keine Ausgabe erfolgt, habe ich das unsichere Gefühl, der Thread wird gar nicht ausgeführt.
Nachtrag: habs erneut ausprobiert: das Ganze funzt nur mit Task.Wait(), m.a.w. der Main-thread endet so schnell, dass der Sub-Thread gar nicht gestartet wird, obwohl er ja (eigentlich) in der Laufzeit des Main-threads augerufen wird. Das muss mit dem TPL-Prinzip zusammenhängen. Alle meine klassischen Multithread-Programme zeigen ein anderes Verhalten. Dort wird j e d e r Sub-Thread gestartet, auch dann, wenn der Main-Thread vor dem Sub-Thread terminiert.
Gruss Luccas
Ralf Jansen - Mi 10.08.16 11:27
Zitat: |
leider nein, ich übersetze grundsätzlich Konsolen-Progamme "ohne Debugging" (das Konsolenfenster bleibt nach der Ausgabe stehen) |
Das solltest du ändern. Lernen ohne Debugging ist irgendwie sinnfrei.
GeraldVonRiva - Mi 10.08.16 11:28
Zitat: |
Mit Task.Wait() sehe ich zwar die Ausgabe, verstehe aber den Vorgang trotzdem nicht (und das würde ich gern). Wenn keine Ausgabe erfolgt, habe ich das unsichere Gefühl, der Thread wird gar nicht ausgeführt. |
Deine Aussage ist so schon Richtig. Die Ausgabe erfolgt nicht weil dein Thread die Ausgabe nicht schaft zu erreichen.
Dein Programm wird durch die Main Methode als Prozess gestartet. Nun erstellst du in der Main Methode einen Thread durch Thread.start(). Dein Prozess hat nun zwei Threads, welche unabhängig von einander arbeiten. Der Thread in dem aber deine Main Methode arbeitet hat nach dem Thread.start() nichts mehr zu tun. Dadurch wird die Main Methode fertig und somit endet auch dein Prozess. Der Thread, welchen du aber in der Main-Methode gestartet hast ist nur solange aktiv wie dein Prozess aktiv ist.
Stelle dir das so vor:
1. Du hast ein Programm, welches als Prozess arbeitet.
2. Du hast deine Main Methode, welche wenn sie fertig ist deinen Prozess schließt.
3. Startest du nun in der Main Methode einen Thread -> hat dein Prozess 2 Threads.
4. Der Thread der Main-Methode wird als erster fertig, schließt den Prozess und damit auch deinen noch nicht fertigen aktiven Thread.
5. Thread.wait() sagt dem Thread der Main-Methode er soll solange warten bis der andere Thread fertig ist. -> Dein weiter Thread erzeugt die Ausgabe
mfg
Gerald
Luccas - Mi 10.08.16 11:53
Hallo
Klar, ich hab das schlichtweg verwechselt. Das Konzept arbeitet nach dem Prinzip Vordergrund-Thread/Hintergrund-Thread und Threadpool.
Dort muss ich nämlich auch immer ein Join() (oder Wait oder WaitAll) einbauen, damit es korrekt funktioniert.
Was ich eben geschrieben habe gilt nur für gleichberechtigte Vordergrund-Threads.
Manchmal sieht man echt vor lauter Wald die Bäume nicht mehr (oder ist es umgekehrt)?
Gruss und Danke!
Luccas
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!