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