Проблема с записью в элемент управления из другого класса и другого потокаC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Проблема с записью в элемент управления из другого класса и другого потока

Сообщение Anonymous »

У меня есть код, который с помощью UDP передает букву «P» на Arduino WiFi.

Он должен транслировать 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 и возникает в методе WifiTools_OnRichText().

Если я закомментирую код в блоке catch :

Код: Выделить всё

OnRichText?.Invoke(null, new RichTextEventArgs { Msg = "Wifi Send Fail" });
тогда отладка запускается без проблем, но примечания записываются в RichTextBox. Но я вижу на своем Arduino, что трансляции были отправлены.

Подробнее здесь: https://stackoverflow.com/questions/791 ... her-thread
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»