[英]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);
}
}
}
另外,您可以结合使用lock
和bool
标志来确定在触发计时器事件时调用check()
方法是否仍在运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.