Improve code to handle disconnected card reader during runtime.

Correct thread/memory leak issue where two main threads were created/running. (bad juju!)

#90
This commit is contained in:
Chris.Watts90@outlook.com 2018-03-06 15:10:10 +00:00
parent e52e9327ac
commit 901e9190a4

View File

@ -15,6 +15,7 @@ namespace CardReaderService
private AutoResetEvent _mainWorkerTerminationSignal; private AutoResetEvent _mainWorkerTerminationSignal;
private string _readerName = ""; private string _readerName = "";
private SCardMonitor _cardMonitor; private SCardMonitor _cardMonitor;
private bool _initialised=false;
public Service1() public Service1()
{ {
@ -40,6 +41,7 @@ namespace CardReaderService
Console.WriteLine(_cardMonitor.GetCurrentState(0)); Console.WriteLine(_cardMonitor.GetCurrentState(0));
if (_cardMonitor.GetCurrentState(0) == SCRState.Unknown if (_cardMonitor.GetCurrentState(0) == SCRState.Unknown
|| _cardMonitor.GetCurrentState(0) == SCRState.Unavailable || _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. //|| _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()) if (!WeHaveValidCardReader())
{ //only do this if we don't have a valid card reader { //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"); Console.WriteLine("Starting.. Getting available readers");
var ctxFactory = ContextFactory.Instance; var ctxFactory = ContextFactory.Instance;
using (var context = ctxFactory.Establish(SCardScope.System)) using (var context = ctxFactory.Establish(SCardScope.System))
@ -142,8 +153,8 @@ namespace CardReaderService
_cardMonitor = new SCardMonitor(ctxFactory, SCardScope.System); _cardMonitor = new SCardMonitor(ctxFactory, SCardScope.System);
_cardMonitor.CardInserted += _cardMonitor_CardInserted; _cardMonitor.CardInserted += _cardMonitor_CardInserted;
_cardMonitor.Start(_readerName); _cardMonitor.Start(_readerName);
StartWorkerThread(); _initialised = true;
} }
else else
{ {