2017-05-08 11 views
0

いくつかのハードウェアとの通信のためにクラス内の.net SerialPortをプロパティとして使用しています。私がプログラムを閉じると、私は接続を閉じる前にstopコマンドを送る必要があります。クラスdeconstructorが起動されたときにSerialPortプロパティが閉じられる

私は、私が書いたクラスの私の解体者の中でこれをするのが最もエレガントな方法だと思ったが、私はSerialPortがdecontrcutorが解雇された時に閉じられ、ここで

は、同じエラーが発生し、私が書いたテストクラスです:

public class SerialPortTestClass 
{ 
    private System.IO.Ports.SerialPort ComPort { get; set; } 

    public SerialPortTestClass() 
    { 
     ComPort = new System.IO.Ports.SerialPort 
     { 
      BaudRate = 38400, 
      StopBits = System.IO.Ports.StopBits.One, 
      NewLine = ((char)19).ToString(), 
      Parity = System.IO.Ports.Parity.None, 
      Handshake = System.IO.Ports.Handshake.None, 
      RtsEnable = false, 
      ReadBufferSize = 512, 
      ReadTimeout = 5000, 
      ReceivedBytesThreshold = 1 
     }; 
    } 

    public void Connect(string port) 
    { 
     ComPort.PortName = port; 
     ComPort.Open(); 
    } 

    public void Disconnect() 
    { 
     var bytes = new byte[] { 83, 80, 32, 115, 54, 19 }; 
     ComPort.Write(bytes, 0, bytes.Length); 
     ComPort.Close(); 
    } 

    ~SerialPortTestClass() 
    { 
     if (ComPort.IsOpen) 
      Disconnect(); 
    } 
} 

は誰SERIALPORTが閉じられた理由を考えて、どのようにこの動作を修正するにしていますか?

+0

については これは、シリアルポートとは何の関係もありません。デストラクタはシャットダウン時に呼び出されないためです。それを解決するには、クラスをどのように実行するかを知る必要があります。コンソールアプリケーションですか?ウェブアプリケーション? – fhogberg

+0

クラスはwpfデスクトップアプリケーションの一部です。 – dukemadcat

答えて

0

この問題は、アプリケーションの終了時にコードが実行されていることを確認する必要があります。デストラクタは、アプリの終了時に実行される保証はありません。

あなたのクラスをIDisposableにする方法があります。 usingブロックでインスタンスをラップすると、終了する前にDispose()が呼び出されます。

public class SerialPortTestClass : IDisposable 
{ 
    public void Dispose() 
    { 
     if (ComPort.IsOpen) 
      Disconnect(); 
    } 
    ... 

と使用方法:

using (var sp = new SerialPortTestClass()) 
{ 
    //Your code goes here 
} 

SerialPortTestClassがウィンドウに住んでいる場合は、ウィンドウが閉じたとき、あなたは、切断を呼び出す必要があります。私はこれがアプリの終了時に常に起こったと信じている。あなたのMainWindow.xaml.csに次のメソッドを追加することになるWPFアプリケーション

protected override void OnClosed(EventArgs e) 
{ 
    var vm = this.DataContext as MainWindowViewModel; 
    vm.SerialPort.Disconnect(); 
    base.OnClosed(e); 
} 
+0

'SerialPort'を使用するクラスは、プログラムの完全な実行時間にわたって実行されるので、ローカルの' using'ステートメントを書くのは難しいでしょう。 – dukemadcat

+0

SerialPortTestClassはどこで作成しますか?どのように参照しますか? – fhogberg

+0

これは、次のように参照される 'ViewModel'で宣言され、初期化されます: dukemadcat

関連する問題