67923


.NET Framework 4.7.2  
Microsoft Visual Studio Community 2019  
Version 16.6.2

上記環境でシリアル通信を行うWPFアプリを作成しています。  
SerialPortクラスのOpen(), Close()を下記のように連続で投げた場合にフリーズが発生します。

[code]

            private bool CheckPortState()
            {
                var able = true;
                var mes = string.Empty;
                try
                {
                    SelectedPort.Open();
                    SelectedPort.Close();
                }
                catch(Exception e)
                {
                    mes = e.Message;
                    able = false;
                }
    
                var str = able ? "Available." : "Disable.";
                Main.Instance.EventLogger.WriteLine($"{SelectedPort.PortName} ... {str}");
                if (!able)
                {
                    Main.Instance.EventLogger.WriteLine(mes);
                }
                return able;
            }
    
[/code]

ここでOpen(), Close()を連続で投げているのは、  
他のアプリケーションでポートが使用中の場合を検知するのに  
SerialPortクラスのIsOpenプロパティでは不十分なためです。

これを調査中、Open(), Close()の前後にそれぞれConsole出力を入れたところ  
現象が発生しなくなりました。  
そこで、連続で投げていることが原因ではと考え、Open(), Close()間に  
Thread.Sleep(1)を入れてみると、問題の症状はやはり発生しなくなりました。

環境によって差があるのか、わかりませんが  
今後の参考にしたいので、この現象が一般的に発生するものなのか教えていただきたいです。


CC BY-SA 4.0
2020-06-23T06:50:52.350
67921
2020-06-23T07:21:32.810
38100
question
c# wpf
SerialPortのOpen(), Close()を連続で投げるとフリーズする


ご質問の現象を指しているかは不明ですが、注意事項として書くくらいには一般的なようです。  
日本語ページの文章はちょっとおかしいですが、英語ページをGoogle翻訳すると意味が通りそうです。

[Remarks - SerialPort.Open
Method(System.IO.Ports)](https://docs.microsoft.com/en-
us/dotnet/api/system.io.ports.serialport.open?view=dotnet-plat-
ext-3.1#remarks)

> **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つ目の文の方は逆に日本語ページの方が良さそうですが。

[注釈](https://docs.microsoft.com/ja-
jp/dotnet/api/system.io.ports.serialport.open?view=dotnet-plat-
ext-3.1#moniker-applies-to) リンクが壊れているのでその下の適用対象のアドレス

> **注釈**  
>  SerialPort オブジェクトごとに存在できる開いている接続は1つだけです。  
>  すべてのアプリケーションのベストプラクティスは、ポートが即座に閉じられない可能性があるため、Close メソッドを呼び出した後、Open
> メソッドを呼び出した後にしばらく待つことです。


CC BY-SA 4.0
2020-06-23T07:10:12.810
67923
2020-06-23T07:21:32.810
2020-06-23T07:21:32.810
26370
26370
67921
answer