Ошибка "Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "richTextBox1" не из того потока, в котором он был создан." - C#

Узнай цену своей работы

Формулировка задачи:

Код клиента:
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" не из того потока, в котором он был создан.
Что? Как? И почему хз... Пробывал уже и через Apptext добовлять и через text += всёравно одна и таже ошибка. И! Как сделать что бы без очереди все подсоеденялись. Тоесть на каждое соеденение новый поток создовался.

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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.2 из 5
Похожие ответы