解决我的对象处置异常

时间:2011-07-20 14:02:12

标签: c# serial-port objectdisposedexception virtual-serial-port

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

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();

    }
}

2 个答案:

答案 0 :(得分:1)

我很确定发生的事情是你正在另一个线程上执行阻止ReadLine()调用(通过你的代理BeginInvoke),然后在Close()上调用SerialPort虽然它仍然在ReadLine()电话中。当数据进入现在关闭(并因此处置)的端口时,抛出异常。

通常的解决方案是在任何未完成的读取完成之前不关闭端口。您可能需要在读取时设置超时,以确保它将在某个时刻返回。有关详细信息,请参阅示例here

答案 1 :(得分:0)

锁定块可能会解决ReadLine_Callback中的问题。另请检查IAsyncResult.IsCompleted状态。

lock(lockerobject)
{
   // your handler logic.
}