System.Threading.Timer的最小间隔

时间:2012-01-16 16:37:17

标签: asp.net multithreading timer cpu-usage intervals

我需要连续检查内存以进行更改才能通知,并且我使用System.Threading.Timer来实现它。我想尽快通知,所以我需要经常调用回调方法,而且我不希望cpu使用100%来执行此操作。

任何人都可以告诉我应该如何设置此计时器的间隔? (我认为尽可能将其设置为最小值是好的)

由于

1 个答案:

答案 0 :(得分:1)

好的,所以有一个非常基本的策略,可以在不产生任何必要的CPU周期的情况下立即通知修改字典,并且涉及使用Monitor.WaitMonitor.Pulse/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!
    }
}

现在,这是非常基本的,您可能会遇到各种同步问题(读/写),因此您应该查看Marc Gravell's implementation of a blocking queue并将相同的逻辑应用于您的字典(基本上是一个阻塞字典)。

此外,上面的示例只会告诉您何时修改字典,但它不会通知您WHICH元素已被修改。如果你从上面学习基础知识并设计你的系统,你可能会更好,因为你可以通过存储密钥(例如最后一个密钥)来知道最后修改了哪个元素,并且只检查与之相关的值。