2011-08-04 4 views
2

우리는 위의 오류가 발생하여 현재 약간의 불행을 초래하는 제 3 자 코드가 있습니다. 이는 간헐적 인 오류이기 때문에 약간 이상합니다. 여기에 문제의 원인이되는 방법 :컬렉션이 수정되었습니다. 열거 연산이 실행되지 않을 수 있습니다. 오류

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 e 만이 Sub가 호출 됨) - removemarks가 False로 전달됩니다. - 이것은 재귀 호출을 통해 완전히 전달되므로 호출하는 행은 절대 실행되지 않습니다. .... 우리가 볼 수없는 사실 로깅은 이것을 증명합니다 ....

누구든지이 문제를 일으킬 수있는 다른 것을 볼 수 있습니까?

덕분에 모든

리처드

답변

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에는 람다를 사용하는 제거 기능이 있습니다.

+0

예 .... 나는 그 줄이 범인처럼 보였다고 생각했지만 호출하는 코드를 보면 매개 변수 [removemarks]가 False로 전달됩니다. 이것은 분명히 코드 라인이 결코 실행되어서는 안된다는 것을 의미합니다! – user481777

+0

거짓이면 전체 기간 동안 거짓이며 예외가 발생해서는 안됩니다. 하지만 나는이 코드에서이 오류를 일으킬 수있는 유일한 행이'.Remove' 호출임을 확신합니다. –

+0

전적으로 동의합니다 -하지만 IntLocateDictionaries에 대한 전체 웹 응용 프로그램에 대한 검색을 수행하고 내가 위에서 지정한 한 장소에서 호출됩니다 - 그리고 그 [거짓말을 통과] ... 따라서, 왜 내가 완전히 당황 스럽네요 ! – user481777

관련 문제