我需要连续检查内存以进行更改才能通知,并且我使用System.Threading.Timer来实现它。我想尽快通知,所以我需要经常调用回调方法,而且我不希望cpu使用100%来执行此操作。
任何人都可以告诉我应该如何设置此计时器的间隔? (我认为尽可能将其设置为最小值是好的)
由于
答案 0 :(得分:1)
好的,所以有一个非常基本的策略,可以在不产生任何必要的CPU周期的情况下立即通知修改字典,并且涉及使用Monitor.Wait
和Monitor.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元素已被修改。如果你从上面学习基础知识并设计你的系统,你可能会更好,因为你可以通过存储密钥(例如最后一个密钥)来知道最后修改了哪个元素,并且只检查与之相关的值。