[VS 2017]、C#にて、SeriaPortクラスで作成したオブジェクトをdispose()する事についてです。

mes04 mes04 20 評価のポイント
2024-12-25T05:32:07.88+00:00

お世話になります。

件名にあります通り、[VS 2017]、C#にて、SeriaPortクラスで作成したオブジェクトをdispose()する事についてです。

例えば、USB-シリアル変換ケーブルなどを、PCのUSBポートを挿している状況で、

C#のプログラムで、上記のCOMポートに対して、SerialPortクラスを利用して、

オブジェクトを生成します。

上記のケーブルを安全に抜く為には、SerialPortオブジェクトをdispose()すれば、

問題ないのでしょうか?

大まかなご説明で恐縮ですが、何かしらのご返事頂けますと幸いです。

よろしくお願いします。

Visual Studio
Visual Studio
Windows、Web、モバイル デバイス用のアプリケーションを構築するための統合開発ツールの Microsoft スイートのファミリ。
103 件の質問
C#
C#
C 言語ファミリをルーツとし、コンポーネント指向プログラミングのサポートを含む、オブジェクト指向およびタイプセーフのプログラミング言語。
37 件の質問
{count} 件の投票

承認済みの回答
  1. SurferOnWww 3,616 評価のポイント
    2024-12-25T09:43:37.91+00:00

    上記のケーブルを安全に抜く為には、SerialPortオブジェクトをdispose()すれば、問題ないのでしょうか?

    「安全に」の意味がよく分かりませんが・・・

    Microsoft の Reference Source の class SerialPort に記載されているコード(抜粋下記)によれば、SerialPort クラスの Dispose() もしくは Close() を呼ぶというのは、内部 Stream をFlush / Close してから null に設定し、その結果 IsOpen プロパティは false になるということだそうです。

    // true only if the Open() method successfully called on this SerialPort object, without Close() being called more recently.
    [Browsable(false)]
    public bool IsOpen
    {
        get { return (internalSerialStream != null && internalSerialStream.IsOpen); }
    }
    
    
    // Calls internal Serial Stream's Close() method on the internal Serial Stream.
    public void Close()
    {
        Dispose();
    }
     
    protected override void Dispose( bool disposing )
    {
        if( disposing ) {
            if (IsOpen) {
                internalSerialStream.Flush();
                internalSerialStream.Close();
                internalSerialStream = null;
            }
        }
        base.Dispose( disposing );
    }
    

    Microsoft のドキュメント SerialPort.Close Method には以下の記述があります(日本語版もありますが翻訳がアレなので英語版)

    "Closes the port connection, sets the IsOpen property to false, and disposes of the internal Stream object."

    ということで、質問者さんの言う安全かどうかは分かりませんのでそれはちょっと置いといて、Dispose() もしくは Close() 後は通信は終わっているので、ケーブルを抜いても通信には影響なさそうとは言えると思います。


1 件の追加の回答

並べ替え方法: 最も役に立つ
  1. gekka 10,566 評価のポイント MVP
    2024-12-25T09:01:15.92+00:00

    SerialPortをOpenしてからCloseする間はUSBケーブルが抜かれると安全ではありません。

    SerialPortをOpenしている場合は、USBポートからUSBケーブルを安全に抜くためにはClose()すればよいです。 DisposeはCloseを兼ねるため安全になります。OpenしていないならDisposeしなくても安全です。
    Closeする前に抜いた場合でも、抜いた後に送受信や設定変更をしなければ例外が発生しないこともありますが、安全とは言えません。(ドライバ次第)

    USB変換ケーブルから232Cケーブルを抜くのは、ハンドシェイク無しならClose()しなくても平気です。ハンドシェイクありだとプログラム上で通信が止待ったままフリーズしたり、例外が発生する可能性はあります。


お客様の回答

回答は、質問作成者が [承諾された回答] としてマークできます。これは、ユーザーが回答が作成者の問題を解決したことを知るのに役立ちます。