1

重複の可能性:
コレクションが変更されました。列挙操作が実行されない場合があります

列挙しながらいくつかのアクションを実行する一般的なリストがあります。

foreach(Action<string> action in actionList) 
{
    if(action != null) {
        action(mystring);
    }
}

今、私はこの例外を受け取ります:

InvalidOperationException:
Collection was modified; enumeration operation may not execute

どうすればこれを解決できますか、私は.NET 3.5に固執しています:/

4

2 に答える 2

6

おそらく、アクションの 1 つが を変更actionListし、イテレータを無効にします。エラーを回避する最も簡単な方法は、最初にリストのコピーを取得することです。

foreach(Action<string> action in actionList.ToList()) 
{
    if(action != null) {
        action(mystring);                               
    }
}

あるいは:

foreach (var action in actionList.Where(action => action != null).ToList())
{
    action(mystring);
}
于 2012-04-19T11:30:33.287 に答える
0

反復中に actionList を変更しました。現在のループと同期されていない 2 番目のスレッド、または変更または別の反復を行うアクション メソッドである可能性があります。したがって、解決策は次のようになります。

var tmp = new List<Action<string> >(actionList);
foreach(Action<string> action in tmp) 
{
    if(action != null) {
      action(mystring);                               
    }
}

ただし、リストを同期する必要がある並列スレッドの場合、アクションの変更の場合にのみ機能します。

于 2012-04-19T11:32:36.477 に答える