1

私は何日もこの問題に取り組んできましたが、私はそれに行き詰まっていて、理解できません。問題は、ポートを閉じると、この有名なエラーが発生することです

The I/O operation has been aborted because of either a thread exit or an application request

私のコードはこのようなものです

 private void MenuItem_Click_1(object sender, RoutedEventArgs e)
        {


            try
            {
                port.ReadExisting();
                port.DiscardInBuffer();         
                if (port.IsOpen)
                {

                    port.Close();
                }

                Window1 caster = new Window1(this);
                caster.ShowDialog();
            }
            catch (IOException)
            {

            }

を実行するport.close()と、上記のエラーが発生します。データ受信イベントのサブスクライブを解除しても、このエラーが発生し、catch ステートメントでキャッチされません。
私はそれを検索し、多くの例を見つけました。そこに提供されているすべてのソリューションが試されましたが、アプリで作業するたびにイライラします.
誰でもこの問題から私を助けることができますか?

4

1 に答える 1

4

はい、これはキャッチできない例外です。DataReceived、ErrorReceived、および PinChanged イベントを起動できるように、SerialPort クラスが開始するワーカー スレッドで発生します。.NET 2.0 以降、ワーカー スレッドで未処理の例外が発生すると、プログラムが終了します。この動作への対処は、このブログ投稿のヒント #4 で説明されています。これは決してしてはいけないことなので、ここでは繰り返しません。純粋な絶望だけが、熟考するのに十分な理由です。

根本的な理由は、Close() メソッドを呼び出したときにデバイス ドライバーによって返される予期しない Windows エラー コードです。運転手は要求にただ従うべきであり、それについて愚痴を言うべきではありません。しかし、USB や BlueTooth デバイスのシリアル ポートをエミュレートする種類のドライバーでは、これを実現するのは困難です。それらの品質は一般的にかなり低いです。

デバイスで賢明でないことを行うと、このような予期しないエラー コードが発生する可能性が特に高くなります。一般に、USB デバイスによくある落とし穴です。プログラムが正しく動作していない場合、適切な処理を行う方法がありません。だからあなたは頭をかき、肩をすくめてコネクタを引っ張る。これで、2 つの問題が発生しました。一部のデバイス ドライバーは、これをうまく処理できず、デバイスを非表示にするだけです。SerialPort クラスにはハンドルが開いていますが。控えめに言っても、これは良い結末にはなりません。Close() を呼び出すと間違いなく爆発します。

コードで行うようにポートを閉じることも、非常にお勧めできません。これは、SerialPort.Close() に関する MSDN の記事で警告されています。そのワーカー スレッドが終了するまでにはしばらく時間がかかります。終了するまで、ポートを再度開くことはできません。それが発生するまでに予測できない秒数がかかります。ここでの知恵は、プログラムを開始するときにのみポートを開き、終了するときにのみポートを閉じる (または決して閉じない) ことです。有効なオプションはありませんが、コアの理由が解決されない場合、プログラムの終了時にファイナライザー スレッドが爆発することに気付くかもしれません。

したがって、ここでの一般的なアドバイスは、ドライバーの更新を探すことです。デバイスを使用している間はデバイスをいじらないでください。デバイスを駐車場に持ち出し、車で数回動かします。そしてそのヒント#4。

于 2013-09-27T13:23:22.680 に答える