ポートでコマンドを発行して応答をリッスンすることにより、SerialPort にデバイスが存在するかどうかを確認する C# コードをいくつか作成しました。ポート速度を設定し、ポートを開き、シリアル ストリームを取得して処理を開始すると、常に 100% 動作します。ただし、一部のデバイスは異なる速度で動作するため、接続を自動ネゴシエートし、デバイスの存在を検出するために、さまざまな速度でデバイスをプローブしようとしています。
これらすべてを単一のスレッドで実行しても問題はありません。ただし、10 の速度での 3 秒のタイムアウトは、シリアル ポートごとに 30 秒であり、いくつかある場合があります。したがって、すべてのポートを同時にプローブする必要があります。
時々これはうまくいきます。時々 Vista のブルースクリーン。スレッドを使用してすべてのポートを同時にプローブすると、ほぼ常にブルースクリーンになります。すべてを 1 つのスレッドで強制的に実行すると、決して起こりません。
USB シリアル Prolific PL-2303 アダプターが x64 ドライバーで使用されています。
@Vinko - ミニダンプの読み取りに関するヒントをありがとう。
私が知る限り、問題の核心は、別のスレッドから新しい非同期 I/O 操作を開始することで、オーバーラップした I/O にまったく新しい意味を与えることができ、ドライバー内で競合状態が引き起こされることです。ドライバーはカーネル モードで実行されるため、BLAM!
エピローグ
キックオフを除き、コールバック ハンドラーの外部で BeginXxx を使用しないでください。また、EndXxx を呼び出すまで BeginXxx を呼び出さないでください。カーネル モードで実行されるドライバー コードで競合状態が発生するためです。
あとがき
これはソケットストリームにも当てはまることがわかりました。