收藏已修改;枚举操作可能无法执行

Posted

技术标签:

【中文标题】收藏已修改;枚举操作可能无法执行【英文标题】:Collection was modified; enumeration operation may not execute 【发布时间】:2011-01-20 07:16:31 【问题描述】:

我无法深入了解此错误,因为它仅在一种情况下发生,而且我找不到任何可能导致错误的代码。

我有一个从多线程 CAB 客户端调用的 3.5 Web 服务。我有一堆针对 Web 服务的单元测试(来自 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”方法中。

任何帮助将不胜感激。

【问题讨论】:

只是想补充一下,该服务已经设置为单例模式。 目前还不清楚错误的来源。什么行或库调用会引发您遇到的异常? 我理解客户端的线上有异常命中,但实际上是服务中异常的传播。 @Greg D - 服务正在抛出异常。我收到带有此错误消息的 SOAPException。 【参考方案1】:

啊,海森堡:D

显然 _accounts 在循环期间被修改。你可以通过这样做来缓解它

For Each account As User In _accounts.ToList()

因此创建和枚举当前 _accounts 的副本,而不是可能更改的实际集合

【讨论】:

_accounts 太大,无法复制。由于我发布了这个问题,我在 _accounts 更新的 only 位置添加了一个锁,但这并没有什么不同。 public sub Initialize SyncLock _accounts _accounts.AddRange(get account from db) End SyncLock end sub 您意识到您只复制参考资料,而不是全部内容 所以除非您说有十亿个帐户,否则不会有问题吗?不过,如果你想加一个锁,你也必须 SyncLock ForEach 循环。 @wwosik -- 不是十亿;只有几百万。 :-) 我会选择 ToList。

以上是关于收藏已修改;枚举操作可能无法执行的主要内容,如果未能解决你的问题,请参考以下文章

收藏已修改;枚举操作可能无法执行

收藏已修改;枚举操作可能无法执行(带锁的多线程)

收藏已修改;枚举操作可能无法执行。到处都在使用锁怎么可能?

C# 集合已修改;可能无法执行枚举操作

C# - 集合已修改;枚举操作可能无法执行

集合已修改,可能无法执行枚举操作