需求:
在登录界面通过RFID刷卡然后实现自动登录
问题:
在登录界面通过RFID刷卡然后实现自动登录,一刷卡就会卡死。但是手动输入账号登录却没有问题。
原因:
原来RFID刷卡在serialPort_DataReceived方法中触发回调函数的时候,需要给登录界面用户ID赋值,然后自动点击登录按钮的时候,在登陆按钮功能中需要把登录界面隐藏同时把RFID刷卡的功能关闭掉,此时就需要把登录界面绑定的SerialPort的端口号Close(),执行到这一步Close()的时候就会卡死。原因就是如果正在读取数据的时候,你去关闭串口,会卡死的。
解决方案:
代码:
Invoke会阻塞工作线程,也就是阻塞读取数据的线程。
private void ReceiveData(string str)
{
if (txt_UserAccount.InvokeRequired)
{
InvokeCallback d = ReceiveData;
txt_UserAccount.Invoke(d, new object[] { str });
}
else
{
}
}
改善代码:
BeginInvoke不会阻塞工作线程,也就是读取数据的线程继续执行。
private void ReceiveData(string str)
{
if (txt_UserAccount.InvokeRequired)
{
InvokeCallback d = ReceiveData;
txt_UserAccount.BeginInvoke(d, new object[] { str });
}
else
{
}
}