diff --git a/CardReaderService/CardReaderService/Service1.cs b/CardReaderService/CardReaderService/Service1.cs index 9cd3413..7039de9 100644 --- a/CardReaderService/CardReaderService/Service1.cs +++ b/CardReaderService/CardReaderService/Service1.cs @@ -15,6 +15,7 @@ namespace CardReaderService private AutoResetEvent _mainWorkerTerminationSignal; private string _readerName = ""; private SCardMonitor _cardMonitor; + private bool _initialised=false; public Service1() { @@ -40,6 +41,7 @@ namespace CardReaderService Console.WriteLine(_cardMonitor.GetCurrentState(0)); if (_cardMonitor.GetCurrentState(0) == SCRState.Unknown || _cardMonitor.GetCurrentState(0) == SCRState.Unavailable + || _cardMonitor.GetCurrentState(0) == (SCRState.Ignore | SCRState.Unavailable) //|| _cardMonitor.GetCurrentState(0) == SCRState.Unaware //if we say this is an invalid state, we cause a memory leak where we create a duplicate card monitor, subscribe and overwrite. ) { @@ -129,6 +131,15 @@ namespace CardReaderService { if (!WeHaveValidCardReader()) { //only do this if we don't have a valid card reader + if (_initialised) + { + //card reader no longer available, tidy up. + _cardMonitor.Cancel(); + _cardMonitor.CardInserted -= _cardMonitor_CardInserted; + _cardMonitor.Dispose(); + _cardMonitor = null; + _initialised = false; + } Console.WriteLine("Starting.. Getting available readers"); var ctxFactory = ContextFactory.Instance; using (var context = ctxFactory.Establish(SCardScope.System)) @@ -142,8 +153,8 @@ namespace CardReaderService _cardMonitor = new SCardMonitor(ctxFactory, SCardScope.System); _cardMonitor.CardInserted += _cardMonitor_CardInserted; _cardMonitor.Start(_readerName); - - StartWorkerThread(); + + _initialised = true; } else {