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:
parent
e52e9327ac
commit
901e9190a4
@ -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))
|
||||||
@ -143,7 +154,7 @@ namespace CardReaderService
|
|||||||
_cardMonitor.CardInserted += _cardMonitor_CardInserted;
|
_cardMonitor.CardInserted += _cardMonitor_CardInserted;
|
||||||
_cardMonitor.Start(_readerName);
|
_cardMonitor.Start(_readerName);
|
||||||
|
|
||||||
StartWorkerThread();
|
_initialised = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user