2017-09-10 2 views
-1

私は新しいシリアルポートを作成し、それを開くプライベート関数を持っています。時々、私はアプリケーションを終了する "安全なハンドルが閉じられました"例外を取得します。さて、私はいくつかのオプションの修正を読んでいて、あなたの経験から、私のコードで本当の問題かもしれないものを知りたいと思っています。 1)_serialPort変数をこのプライベート関数の範囲外に定義する必要があります。 2)シリアルポートのreadTimeoutプロパティは無限ではありません。 3)上記のusingステートメントは、portName変数を削除します。安全なハンドルが閉じられました - 修正する多数のオプション

SerialPort _serialPort; 
string[] devices = 
ConfigurationManager.AppSettings["GasAnalyzerDeviceName"].Split(','); 
string portName; 
using (var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity")) 
{ 
    portName = (from p in searcher.Get().Cast<ManagementBaseObject>() 
           let c = "" + p["Caption"] 
           where c != null 
           where devices.Any(d => c.Contains(d.Trim())) 
           from pn in SerialPort.GetPortNames() 
           where c.Contains(pn) 
           select pn).FirstOrDefault(); 

} 
       if (portName == null) 
        portName = ConfigurationManager.AppSettings["GasAnalyzerPortName"]; 

       if (portName == null) 
        throw new Exception("Gas port not found"); 

       // Create a new SerialPort object with default settings. 
       _serialPort = new SerialPort(); 

       // Set Serial port properties 
       _serialPort.PortName = portName; 
       _serialPort.BaudRate = 115200; 
       _serialPort.DataBits = 8; 
       _serialPort.Parity = Parity.None; 
       _serialPort.StopBits = StopBits.One; 
       _serialPort.Handshake = Handshake.None; 
       _serialPort.ReadTimeout = Timeout.Infinite;//1200; 
       _serialPort.WriteTimeout = 1200; 

ありがとう!

+2

コードの実際の問題は、あなたの質問に投稿されていないということです。 – Guy

+0

@Guy、それは今、それに問題がありました。ありがとう。 – NettaD

+0

どのラインが例外を投げていますか? – mjwills

答えて

0

オプション2)と3)を破棄することができます。

数字1は候補ですが、十分なコードがありません。SerialPortへの参照が他にない場合、ガベージコレクションの候補になります。ガベージコレクションが完了すると、それにアクセスしようとすると例外が発生します。私はNullReferenceExceptionと思っています。

もう1つの原因が考えられます。たとえば、シリアルポートがエミュレートされている場合などです。 USBデバイスであり、アプリケーションの実行中にそのデバイスが削除されると、その下にある接続が破棄されます。 アプリケーションでSerialPortを使用しようとすると、「安全なハンドルが閉じられました」例外が発生します。

+0

ありがとう、デバイスが削除されていないので、おそらく最初の解決策です。常に起きるわけではないので、問題が新しい修正で返されるかどうかを確認してください。ありがとう! – NettaD

関連する問題