Ошибка "Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "richTextBox1" не из того потока, в котором он был создан." - C#
Формулировка задачи:
Код клиента:
Код сервера:
Вот в сервере возникает ошибка при запуске клиента -
Что? Как? И почему хз... Пробывал уже и через Apptext добовлять и через text += всёравно одна и таже ошибка.
И! Как сделать что бы без очереди все подсоеденялись. Тоесть на каждое соеденение новый поток создовался.
public partial class Form1 : Form
{
string IP;
string Port;
Socket socket;
EndPoint end;
public Form1()
{
InitializeComponent();
this.IP = "127.0.0.1";
this.Port = "5087";
Control.CheckForIllegalCrossThreadCalls = false;
}
private void Form1_Load(object sender, EventArgs e)
{
// инициализация сокета
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// создание параметра для подключения к серверу
IPAddress ip = IPAddress.Parse(IP);
IPEndPoint ipe = new IPEndPoint(ip, int.Parse(Port));
end = (EndPoint)ipe;
try
{
socket.Connect(ipe);
this.Text += " - Соединение установлено";
}
catch // на случай каких-либо проблем
{
MessageBox.Show("Проблемы с установкой соединения.\nПриложение будет закрыто.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit();
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
socket.Close();
Application.Exit();
}
}public partial class Form1 : Form
{
// делегат для ожидания соединения
private delegate void Connect();
Socket socket;
Socket client;
EndPoint end;
byte[] buffer;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// инициализация сокета
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// говорим, чтобы сервер использовал любой ip
IPAddress ip = IPAddress.Any;
// созаем параметр для привязки сокета к адресу
IPEndPoint ipe = new IPEndPoint(ip, 5087);
end = (EndPoint)ipe;
// привязка сокета к адресу
socket.Bind(ipe);
// указываем количество запросов на соединение в очереди
socket.Listen(1);
richTextBox1.AppendText("\n>" + DateTime.Now.ToString() + " Порт в режиме ожидания соединения");
// выполняется асинхронно в потоке, тем самым программа не зависает
new Connect(delegate() { Conect(); }).BeginInvoke(null, null);
timer1.Enabled = true;
}
private void Conect()
{
client = socket.Accept();
richTextBox1.AppendText("\n>" + " Соеденение установлено.");
}
// метод для завершения приложения
private void Quit()
{
socket.Close();
Application.Exit();
}
private void timer1_Tick(object sender, EventArgs e)
{
richTextBox1.AppendText("\n>" + DateTime.Now.ToString() + " Start server.");
richTextBox1.AppendText("\n>"+DateTime.Now.ToString()+" Server Ready!");
timer1.Enabled = false;
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
Quit();
}
}
Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "richTextBox1" не из того потока, в котором он был создан.
Решение задачи: «Ошибка "Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "richTextBox1" не из того потока, в котором он был создан."»
textual
Листинг программы
public delegate void AddMessageDelegate(string message);
public void LogAdd(string message)
{
richTextBox1.AppendText(message);
}
private void timer1_Tick(object sender, EventArgs e)
{
Invoke(new AddMessageDelegate(LogAdd), new object[] { "\n>" + DateTime.Now.ToString() + " Start server." });
Invoke(new AddMessageDelegate(LogAdd), new object[] { "\n>"+DateTime.Now.ToString()+" Server Ready!" });
timer1.Enabled = false;
}