Коллекция была изменена; операция перечисления может не выполняться - PullRequest
2 голосов
/ 24 февраля 2010

Я не могу докопаться до этой ошибки, потому что это происходит только в одном случае, и я не могу найти какой-либо код, который может быть причиной ошибки.

У меня есть веб-служба 3.5, которую я вызываю из многопоточного CAB-клиента. У меня есть куча модульных тестов для веб-службы (из кода 3.5 и 2.0), и он работает нормально. Однако в реальном приложении оно не работает 90% времени, а оставшиеся 10% времени оно решает работать.

Код:

Friend Function ExecuteSearch(ByVal query As String) As List(Of SomeObject)
    Dim searchResults As List(of Object) = _searcher.UserSearch(query)
    Return searchResults
End Function 

// In Searcher
Public Function UserSearch(ByVal query As String) As List(Of SomeObject)
    Return Translate(Search.GetResults(query))
End Function

// In Search
Public Function GetResults(ByVal query As String) As List(Of SomeObject)
    Dim service As New FinderService.FinderService()
    Dim results As New List(Of String)
    Dim serviceResults As IEnumerable(Of String) = service.Search(query)    // <-- ERRORS OUT HERE 

    results.AddRange(serviceResults)

    Return results
End Function

// In the service
Public Function Search(ByVal query As String) As IEnumerable(Of String)
        Initialize() // Initializes the _accounts variable
        Dim results As New List(of String)
        For Each account As User In _accounts
            If a bunch of conditions Then
                results.Add(account.Name)
            End IF 
        End For 

        Return results 
End Function 

Точки останова попадают в эти коды (в этом порядке). Строка с ошибками находится в методе «GetResults».

Любая помощь будет оценена.

1 Ответ

7 голосов
/ 24 февраля 2010

Ах, Гейзенбагс: D

Видимо, _accounts изменяются во время цикла. Вы можете облегчить это, выполнив

For Each account As User In _accounts.ToList()

поэтому создается и перечисляется копия текущего _accounts, а не фактическая коллекция, которая может измениться

...