c# - 2 wątki - problem

0

Witam
Otóż mam problem z prawidłowym działaniem wątków a dokładniej wątku w wątku.
W metodzie listen wykonuje się 1 settext i działa prawidłowo następnie z listen tworzony jest kolejny watek do daneKlienta
i w tej metodzie jest kolejne wywołanie settext które kończy mi się błędem.
kod:

 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Collections;
using System.IO;
namespace testserver
{
    public partial class Form1 : Form
    {
        private TcpListener server = null;
        private TcpClient klient = null;
        private ArrayList listaKlientow = new ArrayList();
        private bool aktywnyServer = false;

        public Form1()
        {
            InitializeComponent();
        }
        delegate void SetTextCallBack(string tekst);
        private void SetText(string tekst)
        {
            if (this.listBox1.InvokeRequired)
            {
                this.listBox1.Invoke(new SetTextCallBack(SetText), tekst);
                
                
            }
            else
                this.listBox1.Items.Add(tekst);
            /*if (listBox1.InvokeRequired)
            {
                SetTextCallBack f = new SetTextCallBack(SetText);
                this.Invoke(f, new object[] { tekst });
            }
            else
            {
                this.listBox1.Items.Add(tekst);
            }*/
        }
        private void daneKlienta()
        {
            IPEndPoint ip = (IPEndPoint)klient.Client.RemoteEndPoint;
            SetText("Klient: " + ip.Address.ToString());
            NetworkStream ns = klient.GetStream();
            BinaryReader czytanie = new BinaryReader(ns);
            SetText(czytanie.ReadString());

        }
        private void listen()
        {
           /* if (this.InvokeRequired)
            {
                this.BeginInvoke((MethodInvoker)delegate
                {
                    listen();
                });
                return;
            }*/

            try
            {
            
                server.Start();
                SetText("serwer oczekuje na polaczenia");
                while (true)
                {
                    klient = server.AcceptTcpClient();
                    SetText("klient podlaczony");
                    /*
                    NetworkStream ns = klient.GetStream();
                    BinaryReader czytanie = new BinaryReader(ns);
                    string dane = czytanie.ReadString();
                     */
                    Thread watek = new Thread(new ThreadStart(daneKlienta));
                  //  listaKlientow.Add(watek);
                    
                    watek.Start();

                    button1.Enabled = false;
                    button2.Enabled = true;
                }

            }
            catch
            {
                listBox1.Items.Add("blad inicjacji serwera");
                server.Stop();
                aktywnyServer = false;
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            if (!aktywnyServer)
            {
                IPAddress adresIP = null;
                try
                {
                    adresIP = IPAddress.Parse(textBox1.Text);
                }
                catch
                {
                    MessageBox.Show("bledny adres ip");
                    textBox1.Text = string.Empty;
                    return;
                }
                try
                {
                    int port = System.Convert.ToInt16(numericUpDown1.Value);
                    server = new TcpListener(adresIP, port);

                    Thread watek = new Thread(new ThreadStart(listen));
                    watek.Start();
                    aktywnyServer = true;
                }
                catch
                {
                    MessageBox.Show("blad inicjacji");
                }
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (aktywnyServer)
            {
                if (klient != null)
                {
                    klient.Close();
                }
                server.Stop();
                listaKlientow.Clear();
                listBox1.Items.Add("serwer wylaczony");
                button2.Enabled = false;
                button1.Enabled = true;
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {

        }
    }
}

ERROR:
dostaje taki error kiedy uruchamia mi się metoda setText drugi raz z wątku który został stworzony z innego wątku.

Cross-thread operation not valid: Control 'listBox1' accessed from a thread other than the thread it was created on.

Proszę o pomoc w rozwiązaniu problemu, nic mi już do głowy nie przychodzi.;/

0

Musisz zastosować metodę Invoke na formie, czyli this.Invoke(<delegat>); i wstawić tam delegat, który odpowiada za tę akcję.

1 użytkowników online, w tym zalogowanych: 0, gości: 1