2013-06-21 61 views
0

我偶然發現了一個惱人的問題。我有一個計時器,每250ms(列表中的1-5個對象)對一個列表(泛型)進行foreach。如果它「符合」標準,它應該將該對象添加到「忽略列表」中。但問題是,有時它不會將對象添加到忽略列表中,因此讓它通過(即使它在250毫秒前應該添加它)。C#等到對象被插入到列表中(凍結應用程序)

所以我的問題是,什麼最好的方法來確保循環凍結,直到對象已被添加到列表中(現在一切都在主線程上運行)?

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

} 

謝謝:)

+0

什麼是'x'?你用'b'做什麼? –

回答

0

聽起來好像您遇到了競爭狀況 - 可能是check()在最後一次致電check()實際完成之前被調用。

如果你這樣做,將消除競爭條件...

readonly object lockObject = new Object(); 

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

或者,你可以結合使用lockbool標誌,以確定是否check()方法調用它之前仍在運行定時器事件觸發時。

+0

對不起,遲到的回覆,但它的工作,但我不得不在兩個循環中使用它。謝謝 :) – user1997535

0

調用你check()代碼之前關閉計時器(或在check()開始,因爲它不是清楚的情況下就在這裏什麼),並啓用它,當check()收益(或check()的結尾)。這會阻止定時器在代碼完成之前再次被觸發。