我正在开发一个应该从 Mifare 智能卡读取数据的应用程序。我必须创建一个表单,它会定期检查 Mifare 阅读器,当卡在范围内时,读取其序列号并将其发送到父表单。我设法让后台工作人员读取序列号,但由于它会导致跨线程调用错误,我无法从中关闭表单。有没有办法监控 backGroundWorker 所做的工作,当它成功读取卡 ID 时,停止它并关闭子窗体?这是我在 DoWork 方法中使用的代码:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
while (!worker.CancellationPending)
{
MifareReader.CommPort = 4;
MifareReader.PortOpen = true;
MifareReader.mfAutoMode(true);
MifareReader.mfRequest();
if (CardID == "0" || CardID == string.Empty)
{
MifareReader.mfRequest();
CardID = MifareReader.mfAnticollision().ToString();
MifareReader.mfHalt();
}
else if (CardID != "0" && CardID != string.Empty)
{
MessageBox.Show(ObrnutiID);
worker.CancelAsync();
}
MifareCitac.mfHalt();
}
}
这段代码完成了它的工作,但我必须手动关闭表单。有没有办法检查 CardID 变量是否在主线程中更改了它的值,如果是,请关闭表单。我试图通过使用计时器来解决这个问题,但是当我这样做时,计时器会阻塞主窗体线程,并且我无法手动关闭它(当然我必须能够)。你能提出解决这个问题的方法吗?