Thread hängt bei schießen der Aplikation



  • @Th69

    Pack ich meine polling Loop in nen Task, statt in nen Thread, gibts da nen unterscheid was das Problem angeht?



  • Wenn du Invoke machst, dann muss der Main-Thread im Message-Loop laufen - sonst wird Invoke ewig warten.

    Wenn das OK ist, dann kannst du z.B. im entsprechenden "User hat X geklickt" Handler (weiss jetzt nicht auswendig wie der heisst) den Event setzen, und z.B. nen Timer starten. Und das Fenster erstmal noch nicht schliessen. Im Timer kannst du dann prüfen ob der Thread schon terminiert hat. Und wenn er terminiert hat, dann kannst du das Fenster zu machen.

    Dabei muss dir aber klar sein dass in der Zeit der User weiterhin auf Buttons klicken kann etc., und auch weiterhin die entsprechenden Handler aufgerufen werden. D.h. zumindest sollte man das Fenster bzw. alle Controls des Fensters deaktivieren.

    Oder aber du verzichtest auf Invoke, und verwendest statt dessen einen nicht-blockierenden "Kommunikationskanal" zwischen Worker-Thread und GUI-Thread. Wie eben z.B. BeginInvoke.



  • Guten Morgen,

    ahh d.h. meine exit-Handler wird auch in der Message-Loop verarbeitet, die aber durch as While(IsAlive)... blockiert ist, und somit meine ThreadLoop nihc beenden wird, weil er in Dispatcher.Invoke hängt (da diese auch in der MessageLoop) is!?

    👍



  • Erkläre bitte noch einmal genau, was du vorhast.

    Wenn du die Applikation einschlieslich aller Threads beenden willst, sollte

    Application.Exit()
    

    reichen.



  • Ich habe nen Thread zum daten pollen:

    Thread Func:

    do 
                { 
                    ReadDataWithAGLink(); 
                } 
                while (!_manualResetEvent.WaitOne(100));
    

    und um den Thread sauber zu beenden, rufe ich in der Dispse

    _manualResetEvent.Set();
    

    auf.

    Application.Exit();
    

    wird das nich machen!



  • Schätze mal er will nen kontrollierten, sauberen Shutdown machen?



  • Schätze mal er will nen kontrollierten, sauberen Shutdown machen?

    Richtig!

    Alles andere is glaub nich soo cool 🕶



  • Ich muss das Themad doch nochmal aufmachen;)

    Das ganze hier findet ja in einem UserControl stattt...

    _thread = new Thread(ThreadFunc); 
    _manualResetEvent = new ManualResetEvent(false); 
    _thread.Start(); 
    
    .... 
    
    private void ThreadFunc() 
            { 
    
                do 
                { 
                    ReadDataWithAGLink(); 
                    Dispatcher.Invoke(.....);
    
                } 
                while (!_manualResetEvent.WaitOne(100)); 
            HIER!
            } 
    ... 
        public void Dispose() 
            { 
    
                _manualResetEvent.Set(); 
                while (_thread.IsAlive) 
                    Thread.Sleep(100); 
            }
    

    wenn ich das Control zerstöre, also Dipose aufrufe und es dann aus dem VisualTree nehme, dann is das Control ja noch nich zerstört.
    Es wird also in while (_thread.IsAlive) gewartet bis das letze mal Dispatcher.Invoke aufgerufen wurde, danach kann das Control "gelöscht" werden.

    oder blockiert

    while (_thread.IsAlive) 
                    Thread.Sleep(100);
    

    das den dispatcher?? bei Thread.Sleep(100); kann er doch sein zeugs fertig machen?

    oder habe ich ein verständnis problem :p :p





  • Ich habe die starke Befürchtung, dass du dir weder die Probleme über die du stolperst, noch die Lösungen die du dazu dann findest, so genau ansiehst, dass du auch verstehst was da eigentlich wirklich passiert.
    So hast du zwar kurzfristig den Eindruck schneller voranzukommen, aber in Wirklichkeit lernst du nichts.



  • Ja das kann gut sein hustbear.

    Deswegen bin ich hier um von euch zu lernen. Aber das Problem das ich habe, kannst du da vll. was dazussagen:)



  • Hab ich doch schon. Du bist bloss ein wenig lernresistent. Das Problem wegen dem du fragst ist 1:1 das selbe wie im ersten Beitrag. Die Antworten bleiben daher auch 1:1 die selben.


Anmelden zum Antworten