Показать сообщение отдельно
Старый 25.07.2013, 14:33   #1
e-statik
Старший Пользователь
 
Регистрация: 07.05.2010
Возраст: 45
Город: Москва
Регион: 77, 97, 99, 177
Машина: Skoda Octavia RS FL 2010
Сообщений: 318
e-statik is on a distinguished road
По умолчанию Нужна небольшая помощь с кодом (.NET, Win) - не могу сообразить

Пишу обработчик 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;
	}
}
__________________
White Octavia RS FL DSG
e-statik вне форума   Ответить с цитированием