【问题标题】:Solve my Object Disposed Exception解决我的对象处理异常
【发布时间】:2011-07-20 14:02:11
【问题描述】:

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

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

    }
}

【问题讨论】:

  • 我很确定我已经在几个小时前看到了这个问题。
  • 查看异常的堆栈,看看是哪一行。

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


【解决方案1】:

我很确定发生的事情是您正在另一个线程上执行阻塞 ReadLine() 调用(通过您的委托的 BeginInvoke),然后在 SerialPort 上调用 Close() 而它仍在 @ 987654326@电话。当数据进入现在关闭(并因此被释放)的端口时,将引发异常。

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

【讨论】:

    【解决方案2】:

    lock 块可能会在 ReadLine_Callback 中解决您的问题。还要检查 IAsyncResult.IsCompleted 状态。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多