Пишу обработчик CAN шины под винду, в Visual Studio, C#.
Раньше под винду и потоки не писал ничего, пытаюсь разобраться, было много опыта только с ASP.NET, сижу буксую... (
Цель - слушать порт 64888.
Для этого худо бедно осилил запуск потока и чтение в нем сообщений через UdpClient - данные получаю и обрабатываю. Но не могу правильно тормознуть чтение, поставить на паузу. Либо целиком выключить созданный поток и соединение в нём.
Пересмотрел много код снипетов, но пока что-то не заработало, делаю явно неправильно.
Помогите пож! Конкретно хочу мочь ставить чтение на паузу, а так же мочь вообще корректно выключить прослушивание порта и корректно завершить поток.
Ниже код, который удалось наваять.
Код в форме:
Код:
// Это срабатывает, когда в радиобатоне выбирается "Слушать/не слушать"
if (thisRadioButton.Checked) // Начать прослушивание
{
MainWorker = new UdpWorker();
MainWorker.handlerMessageReceived = ReceiverMessage; // привязал метод, кот. будет дергаться в форме на каждом сообщении
MainThreadDelegate = new ThreadStart(MainWorker.DoWork);
MainThread = new Thread(MainThreadDelegate);
MainThread.Start();
}
else // Остановить прослушивание
{
MainWorker.RequestStop();
}
Код собственно чтения - полуфабрикат, ищу правильное решение:
Код:
public class UdpWorker
{
private const int listenPort = 64888;
private UdpClient listener;
private volatile bool _shouldStop;
public delegate void MessageReceived(CanRxMsg msg);
public MessageReceived handlerMessageReceived;
public void DoWork()
{
listener = new UdpClient(listenPort);
IPEndPoint groupEP = new IPEndPoint(IPAddress.Loopback, listenPort);
try
{
while (!_shouldStop)
{
byte[] bytes = listener.Receive(ref groupEP);
if (bytes == null || bytes.Length == 0)
break;
dataHandler(bytes); // Этот метод уже выдаст сообщение наружу, его код не привожу, к проблеме мало относится
}
}
catch (ThreadAbortException)
{
}
finally
{
//listener.Client.Disconnect(false);
//listener.Client.Shutdown(SocketShutdown.Both);
//listener.Client.Dispose();
//listener.Close();
}
}
public void RequestStop()
{
listener.Client.Shutdown(SocketShutdown.Receive);
listener.Client.Close();
_shouldStop = true;
}
}