Задать вопрос
@a63826ndrew
Студент, новичок в Python

Каким образом обработать исключение?

Здравствуйте!
Есть клиент и сервер, и при попытке клиетна подключиться к серверу в коде сервера вылазит исключение:
Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'txtInfo' не из того потока, в котором он был создан.

Что с этим можно сделать?
Вот код сервера:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Threading.Tasks;
using System.Windows.Forms;
using SimpleTcp;

namespace Server
{
    public partial class Server : Form
    {

        public Server()
        {
            InitializeComponent();
        }

        SimpleTcpServer server;

        private void btnStart_Click(object sender, EventArgs e)
        {
            server.Start();
            txtInfo.Text += $"Сервер запущен.{Environment.NewLine}";
            btnStart.Enabled = false;
            btnStop.Enabled = true;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            server = new SimpleTcpServer(txtIP.Text);
            server.Events.ClientConnected += Events_ClientConnected;
            server.Events.ClientDisconnected += Events_ClientDisconnected;
            server.Events.DataReceived += Events_DataReceived;
            btnStop.Enabled = false;
        }
    
        private void Events_DataReceived(object sender, DataReceivedEventArgs e)
        {
            txtInfo.Text += $"{e.IpPort}: {Encoding.UTF8.GetString(e.Data)}{Environment.NewLine}";
        }

        private void Events_ClientConnected(object sender, ClientConnectedEventArgs e)
        {
            txtInfo.Text += $"{e.IpPort} подключился.{Environment.NewLine}";
        }

        private void Events_ClientDisconnected(object sender, ClientDisconnectedEventArgs e)
        {
            txtInfo.Text += $"{e.IpPort} отключился.{Environment.NewLine}";
        }

        private void btnStop_Click(object sender, EventArgs e)
        {
            if (server.IsListening)
                server.Stop();
                txtInfo.Text += $"Сервер остановлен.{Environment.NewLine}";
                btnStart.Enabled = true;
                btnStop.Enabled = false;
        }
    }
}

И на этой строчке вылазит исключение:
txtInfo.Text += $"{e.IpPort} подключился.{Environment.NewLine}";

60157076dbbac566135515.png
txtInfo - это прямоугольник с scrollbar'ом, если что
  • Вопрос задан
  • 79 просмотров
Подписаться 1 Средний 1 комментарий
Решения вопроса 1
У вас это событие вызывается в не-UI потоке. А обращение к контролам доступно только из UI-потока.
Чтобы выполнить действие в UI-потоке:
Dispather.CurrentDispatcher.Invoke(()=>txtInfo.Text += $"{e.IpPort} подключился.{Environment.NewLine}");
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
QWERTYUIOPas
@QWERTYUIOPas
КраткоОСеБе
Where is a static void Main() method?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы