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 変数の値が変更されているかどうかを確認し、変更されている場合はフォームを閉じる方法はありますか。タイマーを使用してこの問題を解決しようとしましたが、そうすると、タイマーがメインフォームスレッドをブロックし、手動で閉じることができません (もちろん、できる必要があります)。この問題を解決する方法を教えてください。