解决我的对象处置异常

本文关键字:异常 对象 我的 解决 | 更新日期: 2023-09-27 18:03:08

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

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

解决我的对象处置异常

我很确定正在发生的事情是,你正在执行阻塞ReadLine()调用上的另一个线程(通过您的委托的BeginInvoke),但随后调用Close()上的SerialPort,而它仍然在ReadLine()调用。当数据从已关闭(因此已被处理)的端口进入时,将抛出异常。

通常的解决方案是在所有未完成的读操作完成之前不关闭端口。您可能需要为读取设置一个超时,以确保它将在某个时间点返回。

锁块可能会在ReadLine_Callback中解决您的问题。还要检查IAsyncResult。IsCompleted地位。

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