-
Notifications
You must be signed in to change notification settings - Fork 47
Open
Description
Hi!
Thank you for your code it is very usefull.
The worker never returns from its thread. Here is a fix:
` BackgroundWorker worker = sender as BackgroundWorker;
while (!e.Cancel)
{
int nErrCode = Card.SCardGetStatusChange(hContext, 1000, ref states[0], 1);
if(worker.CancellationPending)
{
e.Cancel = true;
return;
}
if (nErrCode == Card.SCARD_E_SERVICE_STOPPED)
{
DeviceDisconnected();
e.Cancel = true;
return;
}
//Check if the state changed from the last time.
if ((this.states[0].RdrEventState & 2) == 2)`
Other fix:
`
public void Disconnect()
{
if (connActive)
{
retCode = Card.SCardDisconnect(hCard, Card.SCARD_UNPOWER_CARD);
if (retCode == 0)
{
_worker?.CancelAsync();
connActive = false;
}
}
//retCode = Card.SCardReleaseContext(hCard);
}
public void Watch()
{
this.RdrState = new Card.SCARD_READERSTATE();
readername = GetReadersList()[0];
this.RdrState.RdrName = readername;
states = new Card.SCARD_READERSTATE[1];
states[0] = new Card.SCARD_READERSTATE();
states[0].RdrName = readername;
states[0].UserData = 0;
states[0].RdrCurrState = Card.SCARD_STATE_EMPTY;
states[0].RdrEventState = 0;
states[0].ATRLength = 0;
states[0].ATRValue = null;
_worker = new BackgroundWorker
{
WorkerSupportsCancellation = true
};
_worker.DoWork += WaitChangeStatus;
_worker.RunWorkerCompleted += _worker_RunWorkerCompleted;
_worker.RunWorkerAsync();
}
private void _worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
DisposeWorker();
}
public void Dispose()
{
Disconnect();
DisposeWorker();
}
private void DisposeWorker()
{
System.Diagnostics.Debug.WriteLine("DisposeWorker");
if (_worker != null)
{
if(_worker.IsBusy)
{
_worker.CancelAsync();
return;
}
_worker.DoWork -= WaitChangeStatus;
_worker.RunWorkerCompleted -= _worker_RunWorkerCompleted;
_worker.Dispose();
_worker = null;
}
}
`
You need an implement:
public class NFCReader : IDisposable
Kind regards,
Karoly
Metadata
Metadata
Assignees
Labels
No labels