等待直到对象被插入到列表(冻结应用程序)

本文关键字:冻结 应用程序 列表 插入 对象 等待 | 更新日期: 2023-09-27 18:19:13

我偶然发现了一个恼人的问题。我有一个计时器,每250毫秒检查一个列表(泛型)(列表中的1-5个对象)。如果它"符合"条件,它应该将对象添加到"忽略列表"中。但问题是,有时它没有将对象添加到忽略列表中,因此让它通过(即使它在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
    }
 }

谢谢:)

等待直到对象被插入到列表(冻结应用程序)

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

如果你这样做,它将消除竞争条件…

readonly object lockObject = new Object();
void check()
{
    lock (lockObject)
    {
        foreach (GetAll g in GetAllInList)
        {
            InIgnoreList(g);
        }
    }
}

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

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