Я написал некоторый код C#, который проверяет, присутствует ли устройство на каком-либо SerialPort, выдавая команду на порту и прослушивая ответ. Когда я просто устанавливаю скорость порта, открываю порт, получаю последовательный поток и начинаю обработку, он работает в 100% случаев. Однако некоторые из наших устройств работают на разных скоростях, и я пытаюсь найти устройство на разных скоростях, чтобы автоматически согласовать соединение, а также обнаружить присутствие устройства.
Когда я делаю все это в одном потоке, проблем нет. Однако 3-секундный тайм-аут на десяти скоростях составляет 30 с на последовательный порт, и их может быть несколько. Отсюда и желание прощупать все порты одновременно.
Иногда это работает. Иногда синие экраны Висты. Когда я использую потоки для одновременного исследования всех портов, почти всегда возникают синие экраны. Когда я заставляю все работать в одном потоке, этого никогда не происходит.
USB-последовательный адаптер Prolific PL-2303 используется с драйверами x64.
@Vinko - спасибо за совет по чтению минидампов.
Насколько я могу судить, суть проблемы заключается в том, что, запустив новую операцию асинхронного ввода-вывода из другого потока, можно придать совершенно новый смысл перекрывающемуся вводу-выводу, вызывая состояние гонки внутри драйвера. Поскольку драйвер выполняется в режиме ядра, БУМ!
Эпилог
За исключением запуска, не используйте BeginXxx вне обработчика обратного вызова и не вызывайте BeginXxx до тех пор, пока вы не вызовете EndXxx, потому что вы вызовете состояние гонки в коде драйвера, который работает в режиме ядра.
Постскриптум
Я обнаружил, что это также относится к потокам сокетов.