-4

こんにちは、どこでこの例外をキャッチするか、解決するか教えてください。受信ハンドルを閉じるたびに、まだデータを受信して​​いる場合、このエラーが発生します。

public partial class Form1 : Form
{
    SerialPort sp;
    IAsyncResult recv_result;
    string buffer;

    private delegate string ReadLine_Delegate();
    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            sp = new SerialPort("COM8", 9600);
            sp.Open();
            sp.ReadTimeout = 50000;
            sp.NewLine = "\n\r\0";

            ReadLine_Delegate x = new ReadLine_Delegate(sp.ReadLine);

            recv_result = x.BeginInvoke(new AsyncCallback(ReadLine_Callback),
                                        x);
        }
        catch (Exception ex)
        {

        }
    }

    private void ReadLine_Callback(IAsyncResult iar)
    {
          ReadLine_Delegate y = (ReadLine_Delegate)iar.AsyncState;
          try
          {
              buffer = y.EndInvoke(iar);
          }
          catch
          {
              MessageBox.Show("Error");
              return;
          }
          ListBoxAdd(buffer);
          buffer = "";
          recv_result = y.BeginInvoke(new AsyncCallback(ReadLine_Callback), y);
    }

    private void disconnectButton_Click(object sender, EventArgs e)
    {
        recv_result.AsyncWaitHandle.Close();
        sp.Close();

    }
}
4

2 に答える 2

1

何が起こっているかは、ReadLine()(デリゲートの を介してBeginInvoke)別のスレッドでブロッキング呼び出しを実行しているが、呼び出し中に呼び出しClose()ていることだと確信SerialPortしていReadLine()ます。閉じられた (したがって破棄された) ポートにデータが入ってくると、例外がスローされます。

通常の解決策は、未処理の読み取りが完了するまでポートを閉じないことです。ある時点で確実に戻るようにするために、読み取りにタイムアウトを設定する必要がある場合があります。詳細については、こちらの例を参照してください。

于 2011-07-20T14:11:00.873 に答える
0

lock ブロックは、おそらく ReadLine_Callback 内の問題を解決します。IAsyncResult.IsCompleted ステータスも確認してください。

lock(lockerobject)
{
   // your handler logic.
}
于 2011-07-20T14:51:33.323 に答える