.NET winformのデバッグ中にSerialPortからのObjectDisposedExceptionの原因は何ですか?
-
08-07-2019 - |
質問
Vista SP1 Visual Studio 2008 SP1 .NET 3.5 SP1 C#
SerialPortオブジェクトをプライベート変数として使用するwinformsアプリで遊んでいます。アプリケーションをコンパイルして実行すると、うまく機能します。また、ブレークポイントなしでデバッグモードで実行することもできます。ブレークポイントで停止してコードをステップスルーしようとすると、90%の時間で、「未処理の例外が発生しました」というダイアログが表示され、次の詳細が表示されます。
System.ObjectDisposedExceptionが処理されませんでした Message ="安全なハンドルが閉じられました" Source =" mscorlib" ObjectName ="" スタックトレース: Microsoft.Win32.Win32Native.SetEvent(SafeWaitHandle handle)で System.Threading.EventWaitHandle.Set()で System.IO.Ports.SerialStream.AsyncFSCallback(UInt32 errorCode、UInt32 numBytes、NativeOverlapped * pOverlapped)で System.Threading._IOCompletionCallback.PerformIOCompletionCallbackで(UInt32 errorCode、UInt32 numBytes、NativeOverlapped * pOVERLAP) InnerException:
イライラすることは、シリアル関連のコードをステップオーバーする必要がないことです!ポートを使用して何かを実行する必要があります。したがって、文字列を読み取り、文字列を操作し、2つの数値を加算します。その後、BANGを実行します。
繰り返しますが、これはデバッグしない場合、またはブレークポイントなしでデバッグする場合に問題なく機能します。 CLRが別のスレッドでSerialStreamを破棄するブレークポイントで停止することについて何かがあるようです。
これを引き起こすUSBデバイスの改修に関する問題については、オンラインで多くのチャットがあります。しかし、私はCOM1の組み込みマザーボードポートを使用しています。
.NET 2.0でこの問題が発生したとは思わないので、それに戻る必要があるかもしれません...
コードを投稿する前にアプリケーションをかなり単純化する必要がありますが、以前デバッガーでこのような動作を見たことがありますか?
どうもありがとう!
解決
今朝も同じ問題がありました。驚いたことに、VS2008 Tools-> Options-> Debugging-> Generalで次のオプションを無効にすると、単に消えてしまいました。
- "例外アシスタントを有効にする"
- " .NET Frameworkソースステッピングを有効にする"
- "プロパティと演算子のステップオーバー"
- "プロパティの評価とその他の暗黙的な関数呼び出しを有効にする"
理由はわかりませんが、うまくいきました。
他のヒント
アプリケーションからの応答が得られないため、ポートがOSによって閉じられている可能性があります(ブレークポイントで停止しています)。
これが答えかどうかはわかりませんが、そのプロジェクトについては間違いなく何かがありました。もともと2.0で記述され、VS2008で3.5に変換されました。元のクラスを1つずつ追加する新しいプロジェクトをC#-Express 2008で作成しましたが、今ではそれが魅力のように機能します。何が違うのかわかりません。
これもあります。これは、デバッガーの何らかのバグでなければなりません。上記のアドバイスは機能しました。「プロパティ評価およびその他の暗黙的な関数呼び出しを有効にする」を無効にします。
シリアルI / Oを行うプロパティを持つクラスがあります。おそらく、デバッガーがマウスポインターを上に置いたときに、デバッガーがプロパティ値を表示しようとしているので、デバッガースレッドからIOを実行していると思いました。しかし、そうではないようです。原因がわからない。
同じ問題があり、次のことを行いました:
serialPortLock = Monitor.TryEnter(serialPort, 3000);
Thread.Sleep(5);
serialPort.Write(msg, 0, msg.Length);
そして私のRead()についても同じです。 それは私にとって良い回避策のようです!