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.;/