Thread beenden

Gast #1856306
Hallo zusammen,
ich habe foglenden Codeausschnitt:
1
public Form1()
2
        {
3
            InitializeComponent();
4
            CheckForIllegalCrossThreadCalls = false;  
5
            button1.Text = "Connect";
6
            Thread mythread = new Thread(new ThreadStart(listen_tcp));
7
            mythread.Start();
8
        }
9
...
Jetzt möchte ich "mythread" beim Schließen des Hauptformulars beenden, 
allerdings ist "mythread" in der Formclosing Methode gar nicht bekannt. 
Bin nicht so der C# Experte, aber da Form() public ist, sollte ich auf 
mythread aus anderen Methoden zugreifen können oder nicht?
Grüße
Martin
#1856318
Trotz public kannst du auf mythread nicht von außen
zugreifen, weil es eine lokale Variable der Methode ist.
Dazu müsstest du sie außerhalb der Methode (in der Klasse z.B.)
ansiedeln.

Einer, der auch keine Ahnung von C# hat...
Gast #1856340
Super, jetzt kann ich drauf zugreifen. Nur wenn ich das Formular 
schließe, muss ich im Visual Studio danach noch explizt auf Debuggen 
beenden gehen. Ohne Thread schließt es richtig, Thread wird mit Abort() 
beendet. Da noch jemand ne Idee?
#1856850
Hallo

Wenn dein Thread mit irgendwas beschäftigt ist, kann er die 
ThreadAbortExreption (die von Thread.Abort() ausgelöst wird) nicht 
behandeln.

Eine Möglichkeit wäre den Thread in einen Try-Catch einzubauen und die 
ThreadAbortException aufzufangen:
1
    public partial class Form1 : Form
2
    {
3
        public Form1()
4
        {
5
            InitializeComponent();
6
        }
7

8
        Thread t;
9

10
        private void button1_Click(object sender, EventArgs e)
11
        {
12
            t = new Thread(new ThreadStart(work));
13
            t.Start();
14
        }
15

16
        void work()
17
        {
18
            try
19
            {
20
                while (true)
21
                {
22
                    // do something
23
                }
24
            }
25
            catch (ThreadAbortException ex)
26
            {
27
                // stop doing something
28
            }
29
        }
30

31
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
32
        {
33
            t.Abort();
34
        }
35
    }

Alternativ kannst du whs auch innerhalb deiner Thread schleife irgendwo 
Application.DoEvents() einbauen. Das habe ich aber nicht getestet und 
finde es auch nicht so schön.
#1856851
Achso, und nochwas
1
CheckForIllegalCrossThreadCalls = false;

ist nicht schön. Es hat schon seinen Sinn, dass auf illegale 
threadübergreifende Zugriffe geachtet wird. Du solltest dich mal mit dem 
Thema Delegaten auseinandersetzen. (Stichwort "invoke")
Gast #1858575
Hallo Sven
habs mal so versucht, klappt allerdings noch nicht ganz:
1
public void listen_tcp()
2
         {
3
            try
4
            {
5
                IPAddress ipAddress = IPAddress.Any;
6
                listener = new TcpListener(ipAddress, 12345);
7
                listener.Start();
8
                Console.WriteLine("Server is running");
9
                Console.WriteLine("Listening on port " + 12345);
10
                Console.WriteLine("Waiting for connections...");
11
                label15.Text = "test";
12
            -->    s = listener.AcceptSocket();
13
            -->    Console.WriteLine("Connection accepted from " + s.RemoteEndPoint);
14
                //while (s.Connected == true)
15
                //{
16

17
                //    byte[] b = new byte[20];
18
                //    int k = s.Receive(b);
19
                //    Console.WriteLine("Received:");
20
                //    for (int i = 0; i < k; i++)
21
                //        Console.Write(Convert.ToChar(b[i]));
22
                //    ASCIIEncoding enc = new ASCIIEncoding();
23
                //    s.Send(enc.GetBytes("Server responded"));
24
                //    Console.WriteLine("\nSent Response");
25
                //    //s.Close();
26
                //}
27
            }
28
            catch (ThreadAbortException ex)
29
            {
30
          
31
                listener.Stop();
32
                s.Close();
33
                s = null;
34
            }
35

36
            }
Wenn ich die markierten 2 Zeilen auskommentiere klappt es, anscheinend 
krieg ich das Socket nicht ausser Gefecht gesetzt. Hast du da noch ne 
Idee? Ich weiss dass das alles nicht so ganz sauber ist...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.