質問: able ? "Available." : "Disable."; Main.Instance.EventLogger.WriteLine($"{SelectedPort.PortName} ... {str}"); if (!able) { Main.Instance.EventLogger.WriteLine(mes); } return able; } ``` ここでOpen(), Close()を連続で投げているのは、 他のアプリケーションでポートが使用中の場合を検知するのに SerialPortクラスのIsOpenプロパティでは不十分なためです。 これを調査中、Open(), Close()の前後にそれぞれConsole出力を入れたところ 現象が発生しなくなりました。 そこで、連続で投げていることが原因ではと考え、Open(), Close()間に Thread.Sleep(1)を入れてみると、問題の症状はやはり発生しなくなりました。 環境によって差があるのか、わかりませんが 今後の参考にしたいので、この現象が一般的に発生するものなのか教えていただきたいです。
回答: ご質問の現象を指しているかは不明ですが、注意事項として書くくらいには一般的なようです。 日本語ページの文章はちょっとおかしいですが、英語ページをGoogle翻訳すると意味が通りそうです。 Remarks - SerialPort.Open Method(System.IO.Ports) > > **Remarks** > > Only one open connection can exist per SerialPort object. > > The best practice for any application is to wait for some amount of time after calling the Close method before attempting to call the Open method, as the port may not be closed instantly. > > > > > **備考** > > SerialPortオブジェクトごとに存在できる接続は1つだけです。 > > すべてのアプリケーションのベストプラクティスは、ポートがすぐに閉じられない可能性があるため、Closeメソッドを呼び出した後、Openメソッドを呼び出す前にしばらく待機することです。 > > > ちなみに日本語ページの内容はこちら。 1つ目の文の方は逆に日本語ページの方が良さそうですが。 注釈 リンクが壊れているのでその下の適用対象のアドレス > > **注釈** > > SerialPort オブジェクトごとに存在できる開いている接続は1つだけです。 > > すべてのアプリケーションのベストプラクティスは、ポートが即座に閉じられない可能性があるため、Close メソッドを呼び出した後、Open メソッドを呼び出した後にしばらく待つことです。 > > >