-4

您好,any1 可以告诉我在哪里尝试捕获此异常或解决它。当我关闭接收句柄时,如果我仍然收到一些数据,就会出现这个错误。

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 回答