Сокет в потоке останавливает обработку и блокирует пользовательский интерфейс - PullRequest
0 голосов
/ 09 мая 2018

У меня есть отдельное тестовое приложение, разработанное в c # (4.5).Приложение в первую очередь предназначено для отправки некоторых данных в COM-порты.Приложение принимает данные через пользовательский интерфейс, и соответствующие данные отправляются на соответствующие COM-порты.Например: данные из текстового поля 1 переходят в COM 1 при нажатии кнопки, данные из текстового поля 2 переходят в COM 2 при нажатии другой кнопки и т. Д.

Позже мне пришлось добавить функцию, в которой другой наборданные должны быть приняты через сокеты Windows и должны быть отправлены на другой COM-порт, отличный от указанного выше.Этот сокет прослушивания может принимать данные из нескольких источников.Если прослушивающий сокет получает данные от одного к другому, ожидается, что приложение поставит эти данные в очередь и обработает данные на основе «первым пришел - первым обслужен».

Поэтому я создал синхронный сокет для приема данных.Если сервер получает данные из 2 источников, он обрабатывает данные из источника 1 и отправляет статус завершения источнику 1, а затем принимает данные из источника 2, обрабатывает их и сообщает статус, и это продолжается.Сокет создается в потоке, чтобы он мог получать и обрабатывать данные независимо от пользовательского интерфейса.

Приложение выполняло свою задачу, так как большая часть обмена данными осуществлялась через сокеты, и люди на самом деле не использовали пользовательский интерфейс для входаданные.

Недавно, когда люди запустили пользовательский интерфейс, я заметил совершенно новую проблему.Когда кто-то пытается ввести данные в пользовательский интерфейс во время обработки данных сокета, он останавливает обработку данных сокета.Когда я нажимаю ctrl + Alt + Del на хосте, он возобновляет обработку данных сокета.

Я не мог определить свою ошибку здесь.Кроме того, я просмотрел класс Backgroundworkder, но не уверен, что это позволит синхронно обрабатывать команды сокетов.

Пожалуйста, относитесь ко мне как к новичку, так как я все еще учусь, и сложные предложения могуттрудно усваиваться.

public partial class frm_bot : Form
{

    public frm_bot()
    {
        StartServer();
    }

    private void frm_bot_Load(object sender, EventArgs e)
    {
        try
        {
            myThread = new System.Threading.Thread(new System.Threading.ThreadStart(OnClientConnect));
            myThread.IsBackground = true;
            myThread.Start();

        }
        catch (Exception ex)
        {
            showErrorMsg(ex.Message);
        }//catch  
    }

    public void StartServer()
    {
        InitializeComponent();
        System.Net.IPAddress localIPAddress = System.Net.IPAddress.Parse(GetlocalIp());
        IPEndPoint ipLocal = new IPEndPoint(localIPAddress, 8089);
        _listener = new TcpListener(ipLocal);
    }

    private void OnClientConnect()
    {
        try
        {
            _listener.Start();
            TcpClient clientSocket = default(TcpClient);
            clientSocket = _listener.AcceptTcpClient();
            _clientSocket = clientSocket;
            ReadCallback();
        }
        catch (Exception se)
        {
            MessageBox.Show("Could not bind to Port 8089! Please close all Applications that uses Port 8089");
        }
    }
    public void ReadCallback()
    {
        try
        {
            using (StreamReader sr = new StreamReader(_clientSocket.GetStream()))
            using (StreamWriter sw = new StreamWriter(_clientSocket.GetStream()))
            {
                sw.AutoFlush = true;
                char[] c = null;

                while (sr.Peek() >= 0)
                {
                    c = new char[25];
                    sr.Read(c, 0, c.Length);
                    Console.WriteLine(c);
                }

                string d = new string(c);
                string[] cmddata = d.Split('\0');
                string dataFromClient = cmddata[0];

                if (dataFromClient.Length == 0)
                {
                    Console.WriteLine("Client sent empty string!");
                }
                else
                {
                    ProcessSocketData(dataFromClient);
                    sw.Write("Done");
                }
                sw.Close();
            }
            OnClientConnect();
        }
        catch (Exception ex)
        {
            OnClientConnect();
            return;
        }
    }

    public void ProcessSocketData(string sockdata)
    {
        try
        {
            // Socket data is processed here.
        }
        catch (Exception ex)
        {
            MessageBox.Show("Exception on ProcessSocketData: " + ex.Message);
            return;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...