首页 > 解决方案 > 线程上的套接字停止处理并锁定 UI

问题描述

我有一个用 c# (4.5) 开发的独立测试应用程序。该应用程序主要用于向 COM 端口发送一些数据。应用程序通过 UI 接受数据,并将相应的数据发送到相应的 COM 端口。例如:来自文本框 1 的数据在按下按钮时进入 COM 1,来自文本框 2 的数据在按下不同按钮时进入 COM 2 等。

后来我不得不添加一个功能,其中一组不同的数据必须通过 Windows 套接字接受,并且必须发送到上述以外的不同 COM 端口。此侦听套接字可以接收来自多个源的数据。如果侦听套接字接收到背靠背套接字数据,则应用程序应将数据排队并在先到先服务的基础上处理数据。

因此我创建了一个同步套接字来接收数据。如果服务器从 2 个源接收数据,它会处理源 1 的数据并将完成状态发送到源 1,然后从源 2 获取数据,处理并通知状态,然后继续。套接字是在线程上创建的,因此它可以独立于 UI 接收和处理数据。

该应用程序正在实现其目标,因为大部分通信都是通过套接字进行的,人们并没有真正使用 UI 来输入数据。

最近,当人们开始使用 UI 时,我注意到了一个全新的问题。当有人在处理套接字数据时尝试在 UI 上输入数据时,它会停止套接字数据处理。当我在主机上按ctrl++AltDel,它会恢复套接字数据的处理。

我无法确定我的错误在这里。另外,我查看了 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;
        }
    }
}

标签: c#multithreadingsockets

解决方案


推荐阅读