解决我的对象处置异常
本文关键字:异常 对象 我的 解决 | 更新日期: 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.
}