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();
}
}
答案 0 :(得分:1)
我很确定发生的事情是你正在另一个线程上执行阻止ReadLine()
调用(通过你的代理BeginInvoke
),然后在Close()
上调用SerialPort
虽然它仍然在ReadLine()
电话中。当数据进入现在关闭(并因此处置)的端口时,抛出异常。
通常的解决方案是在任何未完成的读取完成之前不关闭端口。您可能需要在读取时设置超时,以确保它将在某个时刻返回。有关详细信息,请参阅示例here。
答案 1 :(得分:0)
锁定块可能会解决ReadLine_Callback中的问题。另请检查IAsyncResult.IsCompleted状态。
lock(lockerobject)
{
// your handler logic.
}