From 901e9190a4cba08e0100504ece01b0e22add3c3b Mon Sep 17 00:00:00 2001 From: "Chris.Watts90@outlook.com" Date: Tue, 6 Mar 2018 15:10:10 +0000 Subject: [PATCH] Improve code to handle disconnected card reader during runtime. Correct thread/memory leak issue where two main threads were created/running. (bad juju!) #90 --- CardReaderService/CardReaderService/Service1.cs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) 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 {