Как реализовать SerialPort с потоком / фоновый рабочий C #? - PullRequest
1 голос
/ 06 августа 2010

Я пишу класс, который будет обрабатывать все последовательные соединения с внешним устройством (т. Е. Чтение и запись). Данные передаются на компьютер с частотой 20 Гц, а иногда данные также записываются на устройство. Затем класс будет выводить действительные данные через событие в основной интерфейс. Я хочу поместить этот класс в отдельный поток, потому что мой предыдущий код вызывал некоторое «заикание» в устройстве, поскольку оно было в основном потоке пользовательского интерфейса.

Я просто не уверен, как структурировать и реализовать класс SerialPort с помощью потокового / фонового работника, потому что я неопытен в этой области.

Будет ли в потоке / фоновом работнике существовать только событие получения данных? Как бы вы передавали данные в созданный поток / фоновый рабочий и из него?

Любые советы или предложения будут высоко оценены!

Ответы [ 3 ]

1 голос
/ 06 августа 2010

Мой первый совет: вы должны думать об этом, как будто это сетевое (Socket) соединение.Проблемы с многопоточностью практически одинаковы.Просматривая документацию MSDN, у них есть (если я правильно помню) два разных способа сделать это: асинхронизация и синхронизация.Лично я бы использовал один из асинхронных способов.

Вы также можете взглянуть на новую библиотеку задач.

Начните изучать это и возвращайтесь, если у вас есть дополнительные вопросы =)

Также из последовательного порта библиотеки msdn с поддержкой потоков пример это для консоли, но в любом случае.

0 голосов
/ 06 августа 2010

Просто используйте событие DataReceived.

0 голосов
/ 06 августа 2010

Вы просто реализуете в другом потоке фактическое использование SerialPort.Когда приходит время «уведомить» ваш пользовательский интерфейс, вы используете «BeginInvoke», чтобы заставить фактическую обработку пользовательского интерфейса запускаться в потоке пользовательского интерфейса.

Что-то вроде:

string s = _port.ReadLine();

form.BeginInvoke((MethodInvoker)delegate
{
  _textbox.Text = s;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...