Farah Uzma Ответов: 1

Выполняться двумя методами параллельно последовательный порт данных, полученных методом с использованием C#


I am working on an application which receives data at every second from serial port.I want to call both functions simultaneously. Please note that each of function is independent of each other.One function is used to display data on chart and other function is used to log data into a file. I used following approach but, I found that they are not running in parallel. Can anyone help me, how to achieve this task in parallel?


Что я уже пробовал:

частный недействительными serialPort1_DataReceived
(объект отправителя, система.ИО.Портах.SerialDataReceivedEventArgs е)
{
RxString = serialPort1. ReadExisting();
этот.BeginInvoke(new EventHandler (Display));
этот.BeginInvoke(new EventHandler(LogFile));
}

Sergey Alexandrovich Kryukov

Что вы сделали, чтобы запустить что-нибудь параллельно? Вам нужны две разные нити. Где они? BeginInvoke в том же потоке, по сути, ничего не делает.
Обработчик событий-это неправильный делегат. использование системы.Action< & gt;, с параметрами, которые вам действительно нужны, а не отправитель EventHandler и eventArgs, которые вы все равно не передаете.
—СА

Farah Uzma

Я использую Rxstring непосредственно в обоих методах.Можете ли вы дать мне ссылку на систему?Действие< & gt;?

1 Ответов

Рейтинг:
8

OriginalGriff

Метод Invoke перемещает выполнение в поток, создавший элемент управления, на который он вызывается, - поток пользовательского интерфейса.
Поскольку событие DataReceived никогда не находится в том же потоке, что и пользовательский интерфейс:
Последовательный порт.Событие DataReceived (Системы.ИО.Порты)[^]
"Событие DataReceived вызывается во вторичном потоке при получении данных из объекта SerialPort."
В результате вы можете максимально приблизиться к тому, что хотите, используя BeginInvoke в задаче отображения и выполнив задачу журнала сразу после этого:

private void serialPort1_DataReceived (object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
    RxString = serialPort1.ReadExisting();
    this.BeginInvoke(new EventHandler(Display));
    LogFile();
    }
Обратите внимание, что это не гарантирует одновременного выполнения - это зависит от того, что делает остальная часть системы.
Но я бы передал строку каждому методу вместо того, чтобы сделать ее глобальным параметром.


Farah Uzma

Спасибо, что теперь он работает.

OriginalGriff

Пожалуйста!