线程上的套接字停止处理并锁定UI

时间:2018-05-08 22:03:15

标签: c# multithreading sockets

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

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

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

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

最近,随着人们开始使用UI,我发现了一个全新的问题。当有人在套接字数据处理过程中尝试将数据输入UI时,它会停止套接字数据处理。当我在主机上按 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;
        }
    }
}

0 个答案:

没有答案