Autor Beitrag
Luccas
Hält's aus hier
Beiträge: 11

Win 8.1, Win 10
C# ( VS 2015 )
BeitragVerfasst: Di 09.08.16 16:01 
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).

ausblenden 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
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 09.08.16 16:16 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: Luccas
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 09.08.16 16:54 
Hallo und :welcome:

genau, das Hauptprogramm wird sofort wieder beendet (und damit auch die gestarteten Tasks bzw. Threads).
Man kann auch programmseitig darauf mittels task.Wait() warten, s. z.B. Gewusst wie: Warten bis zum Abschluss einer oder mehrerer Aufgaben

Für diesen Beitrag haben gedankt: Luccas
Luccas Threadstarter
Hält's aus hier
Beiträge: 11

Win 8.1, Win 10
C# ( VS 2015 )
BeitragVerfasst: 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


Zuletzt bearbeitet von Luccas am Mi 10.08.16 11:44, insgesamt 1-mal bearbeitet
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.

Für diesen Beitrag haben gedankt: Luccas
GeraldVonRiva
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19
Erhaltene Danke: 2



BeitragVerfasst: 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

Für diesen Beitrag haben gedankt: Luccas
Luccas Threadstarter
Hält's aus hier
Beiträge: 11

Win 8.1, Win 10
C# ( VS 2015 )
BeitragVerfasst: 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