Он должен транслировать 3 раза с интервалом в 3 секунды, а затем остановиться.
Чтобы отслеживать это, я хочу видеть отправленные широковещательные сообщения и сообщения, возвращаемые из Arduino, в RichTextBox.
Поскольку мне нужна более сложная программа, я хочу ее структурировать и поэтому поместили метод SendWifiString в класс WifiTools (который в конечном итоге будет включать в себя метод получения).
Я использую System.Timers.Timer для запуска широковещательных рассылок, поэтому это событие Elapsed поднимается в потоке ThreadPool. В обработчике событий Elapsed я генерирую специальное событие для последующей записи в RichTextBox.
Я также добавил кнопку для создания широковещательной рассылки для отладки.
Если я проверю это с помощью «Начать без отладки», все работает нормально, я вижу широковещательные сообщения в RichTextBox, но если я использую «Начать отладку», я получаю сообщение «Недопустимая межпоточная операция: Control 'richTextBox1' доступ из потока, отличного от того, в котором он был создан."
Код: Выделить всё
public partial class Form1 : Form
{
System.Timers.Timer broadcastTimer = new System.Timers.Timer();
public int broadcastCounter = 0;
private delegate void RichText(string text);
WifiTools wifiTools = new WifiTools();
public Form1()
{
InitializeComponent();
StartBroadcastTimer(1000);
wifiTools.OnRichText += WifiTools_OnRichText;
}
public class RichTextEventArgs : EventArgs
{
public string? Msg { get; set; }
};
public void WifiTools_OnRichText(object? sender, RichTextEventArgs e)
{
richTextBox1.Text += e.Msg;
}
class WifiTools
{
public event EventHandler? OnRichText;
public void SendWifiString(string sendString, string _ipAddress, int port)
{
try
{
UdpClient udpClientSendWifiString = new(_ipAddress, port);
Byte[] sendBytes = Encoding.ASCII.GetBytes(sendString);
udpClientSendWifiString.Send(sendBytes, sendBytes.Length);
string richTextBoxMsg = "\nTX: to " + _ipAddress + ":" + port + " Msg: " + sendString;
OnRichText?.Invoke(null, new RichTextEventArgs { Msg = richTextBoxMsg });
}
catch
{
OnRichText?.Invoke(null, new RichTextEventArgs { Msg = "Wifi Send Fail" });
}
}
};
public void StartBroadcastTimer(int broadcastInterval)
{
broadcastTimer.Interval = broadcastInterval;
broadcastTimer.Start();
broadcastTimer.Elapsed += new System.Timers.ElapsedEventHandler(Broadcast!);
}
private void Broadcast(object sender, EventArgs e)
{
string broadcastAddress = "192.168.1.255";
int remotePort = 23921;
wifiTools.SendWifiString("P", broadcastAddress, remotePort);
broadcastCounter++;
broadcastTimer.Interval = 3000;
if (broadcastCounter > 2)
{
//Stops timer and releases all resources (this timer is only used at program start)
broadcastTimer.Dispose();
broadcastCounter = 0;
}
}
private void buttonBroadcast_Click(object sender, EventArgs e)
{
string broadcastAddress = "192.168.1.255";
int remotePort = 23921;
wifiTools.SendWifiString("P", broadcastAddress, remotePort);
}
}
Если я закомментирую код в блоке catch :
Код: Выделить всё
OnRichText?.Invoke(null, new RichTextEventArgs { Msg = "Wifi Send Fail" });
Подробнее здесь: https://stackoverflow.com/questions/791 ... her-thread