繁体   English   中英

C#等待,直到将对象插入到列表中(冻结应用程序)

[英]C# Wait until the object has been inserted to the list (freeze application)

我偶然发现了一个令人讨厌的问题。 我有一个计时器,每250毫秒(列表中的1-5个对象)foreach一个列表(泛型)。 如果“符合”条件,则应将对象添加到“忽略列表”。 但是问题在于,有时它不会将对象添加到忽略列表中,因此可以让它通过(即使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
    }

 }

谢谢 :)

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

这听起来像你遇到的竞争条件-这可能是因为check()被调用的最后一次调用前check()实际上已经完成。

如果您这样做,将消除比赛状况。

readonly object lockObject = new Object();

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM