0

ポートから信号を取得したいのですが、これらの関数を使用してデータを受信しましたが、thread.join() 行でこの例外が発生することがあります。

System.IO.IOException が処理されませんでした

Message="I/O 操作は、スレッドの終了またはアプリケーションの要求により中止されました。

ブレークポイントを挿入してデバッグすると、オンライン thread.join() になるまで正しくなり、UI が停止して何も起こりません。

また、プログラムをリリース モードで実行すると正しく動作しますが、問題はデバッグ モードにあります。

thnx。

    public SignalReader()
    {
        thread = new Thread(new ThreadStart(ThreadMain));
    }
    public void Start(string portName, int rate)
    {
        Stop();
        try
        {
            port = new SerialPort(portName, rate);
            port.Open();
        }
        catch
        {
            ;
        }
        thread.Start();
    }
    public void Stop()
    {

        try
        {
            if (port != null)
            {
                if (port.IsOpen) port.Close();
                if (thread.IsAlive) thread.Join();
                port.Dispose();
                port = null;
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("4:" + ex.ToString());
        }
    }

ポートを閉じてスレッドに参加する順序を入れ替えると:

...
thread.Join();
port.Close();
...

同じ話が存在します。

4

2 に答える 2

0

受け取っているエラーは、次で使用している Stop() が原因です。

public void Start(string portName, int rate)
    {
        Stop();
        try
        {
            port = new SerialPort(portName, rate);
            port.Open();
        }
        catch
        {
            ;
        }
        thread.Start();
    }

アプリはすでに何かを行っており、これを呼び出すと、どこかで使用されているポートが閉じられます。

それを削除してみてくださいStart。ポートが閉じられていない場合、メソッドで例外が発生します。このエラーがどこから来たのかをよりよく理解できます。また、これらのメソッドを使用しているコードの一部を貼り付けていただけますか?

于 2013-09-09T17:16:12.013 に答える
0

使用中にポートを閉じて、フロアマットを引っ張っています。通常、SerialPort.Read() 呼び出しで使用されます。そうです、その通話は失敗します。もうフロア マットはありません。欠けているのは、その例外をキャッチしてスレッドを正常に終了させる catch ブロックです。Join() 呼び出しを完了します。

スレッドがそのような Read 呼び出しで実際にブロックされていることを確認できる限り、これを行うことはまったく珍しいことではありません。通常、これを保証するのはそれほど難しくありません。しかし、Release ビルドでその例外が発生しないことは確かに心配です。それは正常ではありません。デバッガーの [デバッグ] + [ウィンドウ] + [スレッド] を使用して、そのワーカー スレッドで何が起こっているかを確認します。

したがって、問題を解決するには、必要な try/catch を追加するだけです。SerialPort.DataReceived イベントの使用は、まったく異なるアプローチです。まったくクリーンアップせず、スレッドの IsBackground プロパティを true に設定するだけで、プログラムの終了時にスレッドが自動的に終了することも、まったく受け入れられる解決策です。

于 2013-09-09T18:23:22.410 に答える