минимальный интервал для System.Threading.Timer - PullRequest
0 голосов
/ 16 января 2012

Мне нужно постоянно проверять память на предмет уведомлений об изменениях, и я использую System.Threading.Timer для этого. Я хочу получать уведомления как можно скорее, поэтому мне нужно довольно часто настраивать метод обратного вызова, и я не хочу, чтобы процессор использовал для этого 100%.

Может кто-нибудь сказать мне, как я должен установить интервал этого таймера? (Я думаю, что было бы хорошо установить его как можно меньше)

Спасибо

1 Ответ

1 голос
/ 16 января 2012

ОК, поэтому существует очень базовая стратегия, позволяющая немедленно уведомлять вас о внесении изменений в словарь, не вызывая при этом каких-либо необходимых циклов ЦП, и предполагает использование Monitor.Wait и * 1005.* / Monitor.PulseAll.

На очень базовом уровне , у вас есть что-то вроде этого:

public Dictionary<long, CometMessage> Messages = new Dictionary<long, CometMessage>();

public void ModifyDictionary(int key, CometMessage value)
{
    Messages[key] = value;
    Monitor.PulseAll(Messages);
}

public void CheckChanges()
{
    while(true)
    {
        Monitor.Wait(Messages);
        // The dictionary has changed!
        // TODO: Do some work!
    }
}

Теперь, это очень элементарно, и выможет получить всевозможные проблемы с синхронизацией (чтение / запись), поэтому вам следует изучить реализацию блокировки 1013 * Марка Гравелла и применить ту же логику к словарю (по сути, создавая словарь блокировки).

Кроме того, приведенный выше пример сообщит вам только о том, когда изменен словарь, но не проинформирует вас о том, КАКОЙ элемент был изменен.Вероятно, будет лучше, если вы возьмете основы сверху и спроектируете свою систему так, чтобы вы знали, какой элемент был последний изменен, возможно, сохранив ключ (например, последний ключ) и просто проверив значение, связанное с ним.

...