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