Простое обнаружение смартфона

Хорошо, я видел пару сценариев обнаружения мобильных устройств, которые предназначены для идентификации всех мобильных телефонов, кто-нибудь придумал простой сценарий обнаружения смартфонов?

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;
}

Имеет ли первое влияние на производительность, потому что он блокируется в зависимости от степени метода?

Предлагает ли второй даже ту безопасность, которую можно было бы подумать, - что-то ускользает от меня?

Есть ли другие способы сделать это надежно, и предпочтительно?

5
задан Grant Thomas 20 March 2011 в 21:30
поделиться