C#等待对象插入列表(冻结应用程序)

时间:2013-06-21 02:11:32

标签: c#

我偶然发现了一个烦人的问题。我有一个计时器,每250ms(列表中的1-5个对象)预先列出一个列表(Generics)。如果它“满足”标准,它应该将对象添加到“忽略列表”。但问题是,有时它不会将对象添加到忽略列表中,因此让它通过(即使它在250ms之前应该添加它)。

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

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

 }

谢谢:)

2 个答案:

答案 0 :(得分:0)

在调用check()代码之前(或在check()开头时禁用计时器,因为此处不清楚上下文是什么),并在check()返回时启用它(或在check())的末尾。这样可以在代码完成之前停止计时器再次触发。

答案 1 :(得分:0)

听起来你遇到了竞争条件 - 可能是在check()的最后一次调用实际结束之前调用了check()

如果你这样做会消除竞争条件......

readonly object lockObject = new Object();

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

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