Хорошо, я видел пару сценариев обнаружения мобильных устройств, которые предназначены для идентификации всех мобильных телефонов, кто-нибудь придумал простой сценарий обнаружения смартфонов?
I ' это означает, что если интервал выполнения для таймера истекает, пока поток все еще обрабатывается в порядке предыдущего запроса, то тот же обратный вызов будет делегирован для выполнения в другом потоке. Это, очевидно, вызовет проблемы в большинстве случаев, если обратный вызов не распознается повторно, но мне интересно , как сделать это наилучшим (то есть безопасным) способом.
Допустим, у нас есть следующее:
ReaderWriterLockSlim OneAtATimeLocker = new ReaderWriterLockSlim();
OneAtATimeCallback = new TimerCallback(OnOneAtATimeTimerElapsed);
OneAtATimeTimer = new Timer(OneAtATimeCallback , null, 0, 1000);
Если весь шебанг должен быть заблокирован, как таковой:
private void OnOneAtATimeTimerElapsed(object state)
{
if (OneAtATimeLocker.TryEnterWriteLock(0))
{
//get real busy for two seconds or more
OneAtATimeLocker.ExitWriteLock();
}
}
Или должен управляться только вход и выгонять «злоумышленников», как таковых:
private void OnOneAtATimeTimerElapsed(object state)
{
if (!RestrictOneAtATime())
{
return;
}
//get real busy for two seconds or more
if(!ReleaseOneAtATime())
{
//Well, Hell's bells and buckets of blood!
}
}
bool OneAtATimeInProgress = false;
private bool RestrictToOneAtATime()
{
bool result = false;
if (OneAtATimeLocker.TryEnterWriteLock(0))
{
if(!OneAtATimeInProgress)
{
OneAtATimeInProgress = true;
result = true;
}
OneAtATimeLocker.ExitWriteLock();
}
return result;
}
private bool ReleaseOneAtATime()
{
bool result = false;
//there shouldn't be any 'trying' about it...
if (OneAtATimeLocker.TryEnterWriteLock(0))
{
if(OneAtATimeInProgress)
{
OneAtATimeInProgress = false;
result = true;
}
OneAtATimeLocker.ExitWriteLock();
}
return result;
}
Имеет ли первое влияние на производительность, потому что он блокируется в зависимости от степени метода?
Предлагает ли второй даже ту безопасность, которую можно было бы подумать, - что-то ускользает от меня?
Есть ли другие способы сделать это надежно, и предпочтительно?