У меня есть отдельное тестовое приложение, разработанное в 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;
}
}
}