Почему Thread.Sleep() перед SerialPort.Open и Close?

Я замечаю примеры кодов, которые я читаю при закрытии и открытии SerialPort, где люди будут добавлять Thread.Sleep(1000) перед SerialPort.Open() и Close(). Как следующее:

Thread.Sleep(1000);
serialPort1.Open();
/* some code */
Thread.Sleep(1000);
serialPort1.Close();

Я не могу найти никакого объяснения нигде. Почему люди блокируют последовательный порт с помощью Thread.Sleep до того, как он станет открытым или закрытым? Это для какой-то временной цели? Должен ли я ставить Thread.Sleep всякий раз, когда я читаю или пишу на последовательный порт?

3 ответа

Решение

Когда вы открываете порт, класс SerialPort запускает новый поток под капотом, который отвечает (через функцию Windows API WaitCommEvent) за ожидание активности последовательного порта (например, поступление данных) и запуск соответствующих событий для ваших обработчиков. Вот почему такие события, как DataReceived, действительно происходят во вторичном потоке.

Когда вы закрываете порт, вызов Close() немедленно возвращается, но для замедления вторичного потока требуется некоторое время.

Если вы попытаетесь открыть порт слишком быстро после вызова Close, а поток еще не отключился, то экземпляр SerialPort не находится в состоянии, в котором он может начать новое соединение.

Обратите внимание на документацию MSDN для SerialPort.

Для любого приложения рекомендуется подождать некоторое время после вызова метода Close, прежде чем пытаться вызвать метод Open, поскольку порт может быть закрыт не сразу.

Вы можете отслеживать, когда вы закрыли порт, и перед тем, как открыть его снова, убедитесь, что истек произвольный тайм-аут.

Не нужно спать перед чтением / записью, хотя нужно учесть несколько причуд:

Имейте в виду, что класс SerialPort в.NET BCL по-прежнему опирается на базовый Win32 API, и я не думаю, что он получил большую любовь со стороны Microsoft с момента первоначальной реализации.

Для получения дополнительной информации см.:

На один объект SerialPort может существовать только одно открытое соединение. Для любого приложения рекомендуется подождать некоторое время после вызова метода Close, прежде чем пытаться вызвать метод Open, поскольку порт может не закрыться мгновенно.

Посмотрите на эту ссылку.

Я сделал несколько программ Serial I/O на C#, и я не думаю, что я никогда не добавлял подобные сны. Я не испытывал никаких побочных эффектов (с учетом того, что мои приложения никогда не пытались быстро открыть и закрыть последовательный порт)

Вы определенно не должны спать перед чтением или письмом.

Другие вопросы по тегам