Последовательная связь в фоновом потоке - PullRequest
2 голосов
/ 27 января 2012

Быстрый вопрос, касающийся связи между платами Arduino и приложением c # winforms. В основном то, что я сделал до сих пор, это что-то вроде

_serialPort = new SerialPort();
...
_serialPort.Open();
...
_serialPort.DataReceived += OnReceived;
...
private static void OnReceived(object sender, SerialDataReceivedEventArgs c)
{
// Do something
}

Это работает, пока я помещаю это в основной поток приложения. Мой вопрос заключается в том, можно ли написать класс, который делает то же, что и код выше (прослушивание связи через последовательный порт) в фоновом потоке.

Ответы [ 4 ]

4 голосов
/ 27 января 2012

Вы, вероятно, можете, пока создается экземпляр SerialPort и все события и операции происходят в фоновом потоке только .

Из MSDN:

Любые открытые статические (Shared в Visual Basic) члены этого типа являются потокобезопасными.Ни один из членов экземпляра не гарантированно является потокобезопасным.

Таким образом, класс не является "потокобезопасным", поэтому попытка сделать что-либо многопоточным способом не является хорошей идеей.

3 голосов
/ 27 января 2012

Запуск нового потока для выполнения этого кода не является проблемой. Проблема может возникнуть, если вы используете некоторые данные, созданные потоком, для обновления пользовательского интерфейса приложения. Смотрите этот другой вопрос на SO: Как обновить GUI из другого потока в C #?

1 голос
/ 30 апреля 2012

У меня есть ответ:

public delegate void DisplayInfoSentDelegate(byte[] abyBuf);

private void SendThread(_dlg pThis, byte[] abyBuf, int iNumOfBytes)
{
  ...
  pThis.Invoke(new DisplayInfoSentDelegate(DisplayInListBox), new object[] { abyBuf});
}
1 голос
/ 27 января 2012

Я думаю, что это не работает, потому что в вашем OnReceived методе вы пытаетесь записать что-то в элемент управления GUI (например, TextBox).

Эта часть не работает, а не получаетсами данные.Если вы хотите получить доступ к потоку GUI в этом методе, вы должны вызвать [Invoke()][1] или BeginInvoke() на нужном элементе управления и поместить свой код в заданную лямбду.

Дляболее продвинутые вещи, которые вы также можете подумать об использовании ReactiveExtensions и метода ObserveOn().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...