Ошибка "Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д