Skip to content

Worker never stops. #12

@k0nagy

Description

@k0nagy

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

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions