c# - 线程上的套接字停止处理并锁定 UI
问题描述
我有一个用 c# (4.5) 开发的独立测试应用程序。该应用程序主要用于向 COM 端口发送一些数据。应用程序通过 UI 接受数据,并将相应的数据发送到相应的 COM 端口。例如:来自文本框 1 的数据在按下按钮时进入 COM 1,来自文本框 2 的数据在按下不同按钮时进入 COM 2 等。
后来我不得不添加一个功能,其中一组不同的数据必须通过 Windows 套接字接受,并且必须发送到上述以外的不同 COM 端口。此侦听套接字可以接收来自多个源的数据。如果侦听套接字接收到背靠背套接字数据,则应用程序应将数据排队并在先到先服务的基础上处理数据。
因此我创建了一个同步套接字来接收数据。如果服务器从 2 个源接收数据,它会处理源 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;
}
}
}
解决方案
推荐阅读
- azure - Azure 的自定义映像 VM 上没有 Internet
- angular - 如何从父 FormGroup 获取价值?
- php - Wordpress ACF 显示关系问题
- machine-learning - 在二元分类问题中惩罚假阴性
- javascript - 在回调中识别 react-native TextInput 实例
- bash - Bash 递归到包含空格的子文件夹
- c# - C# - 用户定义他们希望用于程序的键绑定
- php - 使用 mysql 和 php 存储用户使用的 IP 的最有效方法?
- javascript - 如何水平折叠 react-bootstrap 手风琴面板?
- python - Improve speed by creating dynamic columns in a Dataframe