Безопасно ли читать и писать на последовательный порт одновременно через разные потоки?
Безопасно ли одновременно читать и записывать на последовательный порт через разные потоки (один поток чтения и один поток записи)? Будет ли необходимо добавить блокировку вокруг чтения / записи в каждом потоке?
3 ответов:
Из документации SerialPort:
Все открытые статические (Общие в Visual Basic) члены этого типа потокобезопасны. Все члены экземпляра не гарантируют потокобезопасности.
Поскольку чтение и запись не статичны, они не будут потокобезопасны. Это очень плохая идея, в любом случае, так как класс SerialPort поддерживает внутренние буферы для вас.
Вам потребуется синхронизировать ввод-вывод с последовательным портом.
Чтение и запись в последовательный порт "одновременно" из разных потоков-это стандартный способ обработки сообщений последовательного порта: один поток обрабатывает чтение, а другой-запись. Допустимый.
Существует ряд последовательных устройств, которые асинхронно передают данные на главную машину, но при этом позволяют передавать команды на само устройство: такие устройства, как сканеры штрих-кодов, сканеры тегов и камеры.
Проблемы?
Проблемы возникают, когда вы пытаетесь синхронизировать ваше сообщение с устройством и обратно.
Например, вы хотите написать команду, а затем немедленно прочитать любой ответ. Ну, в этом случае вы приостановите поток чтения и вручную считаете все данные последовательного порта после записи команды. После обработки команды поток чтения может быть запущен снова.
Резюме
В общем, я бы предложил иметь только одну дополнительную нить это обрабатывает все чтение данных порта и запускает события, такие как
DataReceivedи выполняет все ваши записи из основного потока.
Я бы ожидал, что конкретный случай, который вы описываете, с 1 потоком чтения и 1 потоком записи будет безопасным.
Каналы чтения и записи на аппаратном обеспечении предназначены для использования полного дуплекса, и программное обеспечение должно быть разработано для поддержки этого тоже.
И хотя я не смог найти явного утверждения об этом, пример на странице MSDN для SerialPort также записывает из основного потока, в то время как он читает на другом. Без блокировки.
Comments