2011-08-04 5 views
2

上記のエラーが発生するため、現時点でいくつかの不幸を引き起こすサードパーティ製のコードがあります。断続的なエラーであるため、やや奇妙です。コレクションが変更されました。列挙操作が実行されないことがあります。エラー

Private Shared Sub IntLocateDictionaries(ByVal haystack As ExpDictionary, 
     ByVal needlearray() As Object, _ 
     ByVal resultarray() As Object, ByVal removemarks As Boolean) 

     Dim i As Integer 
     Dim item As Object 

     For i = 0 To UBound(needlearray) 
      If haystack.Exists(needlearray(i)) Then 
       resultarray(i)(CStr(resultarray(i).Count + 1)) = haystack 
       If removemarks Then 
        ExpandIT.FileLogger.LogError("*********** REMOVING From HAYSTACK - COULD CAUSE EXCEPTION! ***************") 
        haystack.Remove(needlearray(i)) 
       End If 
      End If 
     Next 

     ' Scan for sub dictionaries 
     For Each item In haystack.Values 
      If TypeName(item) = "ExpDictionary" Then 
       IntLocateDictionaries(item, needlearray, resultarray, removemarks) 
      End If 
     Next 
    End Sub 

...これは、呼び出し元のラインである:ここでは、問題を引き起こしている方法がある

 currencyproducts = New ExpDictionary 
     priceproducts = New ExpDictionary 
     IntLocateDictionaries(info, New Object() {"_cc", "_csp"}, New Object() {currencyproducts, priceproducts}, False) 

私は、このエラーは通常、列挙しながら、コレクションを変更しようとすることで引き起こされることを理解しますそのため、コレクションを変更するような唯一の行にログを追加したのはなぜですか?

ログを追加して以来、問題はまだ発生していますが、ログは表示されません。これは、あなたは呼び出し側の行のパラメータを調べます(thこのSubが呼び出された場所のみ) - removemarksはFalseとして渡されます。これは再帰呼び出しの途中まで渡され、.Removeを呼び出す行は決して実行されません....表示されない事実ログはこれを証明します....

この問題を引き起こす可能性のある他の人は誰でも見ることができますか?

おかげで、すべての

リチャード

答えて

1

これは、再帰的な方法です。この行が外側の再帰的な方法は、あなたがhaystack.Valuesコレクションを反復処理している

+0

はい...私はその行が犯人のように見えていましたが、呼び出しコードを見ると、パラメータ[removemarks]はFalseとして渡されます。これは確かに、コード行が決して実行されないことを意味します! – user481777

1

このエラーをスローするようになります。ここ

If removemarks Then haystack.Remove(needlearray(i))

needlearray(i)は、内側の再帰的方法によって変更される可能性がありますエラーを引き起こしているようですその後、再帰的にこのラインを呼び出す可能性のあるコールバック:今すぐコードを読む

If removemarks Then haystack.Remove(needlearray(i))

を、あなたのイテレータがhaystack.Valuesであり、haystackでないために動作するはずです。しかし、私はRemoveメソッドが何をしているのか分かりません。おそらくそれは.Valuesに触れていますか?

あなたは、このアドレスには二つの方法があります。

  • forループを使用して、リストを逆方向にカウントし、インデックスによる削除を。
  • 削除するアイテムのリストを収集し、イテレータが終了したら最後に削除します。

LINQには、ラムダを使用するRemove関数が付属していることはかなり確かです。

+0

はい....私はその行が犯人のように見えたと思いましたが、呼び出しコードを見ると、パラメータ[removemarks]はFalseとして渡されます。これは確かに、コード行が決して実行されないことを意味します! – user481777

+0

falseの場合、期間全体にわたってfalseになり、例外は発生しません。しかし、私はこのコードでこのエラーを引き起こす唯一の行が '.Remove'呼び出しであるとかなり確信しています。 –

+0

私は全く同意しますが、私はIntLocateDictionaries用のWebアプリケーション全体を検索しましたが、これは上記の1つの場所でのみ呼び出され、[removemarks]に対してFalseを渡します...したがって、なぜ私は完全に困惑しています! – user481777

関連する問題