0

私は厄介な問題に出くわしました。250ミリ秒ごとにリスト(ジェネリック)をforeachするタイマーがあります(リスト内の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
    }

 }

ありがとう :)

4

2 に答える 2

0

コードを呼び出す前にcheck()(または の冒頭でcheck()、ここにコンテキストが何であるかが明確でないため)タイマーを無効にし、check()戻ったとき (または の最後check()) にタイマーを有効にします。これにより、コードが完了する前にタイマーが再び起動されるのを防ぎます。

于 2013-06-21T02:31:11.057 に答える
0

競合状態が発生しているようです。check()最後の呼び出しcheck()が実際に終了する前に呼び出されている可能性があります。

このようなことをすると、競合状態が解消されます...

readonly object lockObject = new Object();

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

または、フラグとlock組み合わせて使用​​して、タイマー イベントが発生したときにメソッドを呼び出す前に、メソッドがまだ実行中かどうかを判断することもできます。boolcheck()

于 2013-06-21T04:09:06.247 に答える