0

我偶然发现了一个烦人的问题。我有一个计时器,每 250 毫秒(列表中的 1-5 个对象)foreach 一个列表(泛型)。如果它“符合”标准,它应该将该对象添加到“忽略列表”中。但问题是有时它不会将对象添加到忽略列表中,因此让它通过(即使它应该在 250 毫秒前添加它)。

所以我的问题是,确保循环冻结直到对象被添加到列表(现在一切都在主线程上运行)的最佳方法是什么?

 // this method is called every 250ms
 void check()
 {
    foreach (GetAll g in GetAllInList)
    {
       InIgnoreList(g);
    }
 }
 // InIgnoreList(g)
 void InIgnoreList(g)
 {
    foreach(var b in g.List())
    {
       if(IgnoreList.Exists(x => x.Name == g.Name))
       break;

       // New method where I add it, but sometimes the IgnoreList.Exists Check lets it
        through
    }

 }

谢谢 :)

4

2 回答 2

0

在调用您的check()代码之前禁用计时器(或在 的开头check(),因为不清楚这里的上下文是什么),并在check()返回时启用它(或在 结束时check())。这会阻止计时器在代码完成之前再次被触发。

于 2013-06-21T02:31:11.057 回答
0

听起来您遇到了竞争条件 - 可能是check()在最后一次调用check()实际完成之前被调用。

如果你做这样的事情,它将消除竞争条件......

readonly object lockObject = new Object();

void check()
{
    lock (lockObject)
    {
        foreach (GetAll g in GetAllInList)
        {
            InIgnoreList(g);
        }
    }
}

或者,您可以lock结合使用bool标志来确定该check()方法是否仍在运行,然后再在计时器事件触发时调用它。

于 2013-06-21T04:09:06.247 回答