В предыдущем вопросе Я попросил помочь изменить фрагмент кода на Linq. Сегодня этот запрос выдал неожиданное System.InvalidOperationException
с сообщением Коллекция была изменена после создания экземпляра перечислителя , что удивляет меня, потому что приложение запускается однопоточным.
Снимок экрана
Обзор архитектуры системы
Приложение принимает соединения, используя System.Net
и System.Net.Websockets
Пространства имен. Сообщения принимаются, обрабатываются и отправляются с использованием async
и await
. Функции тайм-аута реализуются с использованием System.Timers.Timer
.
Соединения веб-сокетов управляются так называемыми ConnectionHandler
, которые управляются в одноэлементном модуле TableManager
, который поддерживает хэш-набор элементов, который (среди прочих) предоставляет List<ConnectionHandler>
для которого выполняется этот запрос.
Сведения об исключении
Сообщение
Коллекция была изменена после создания счетчика.
Stacktrace
at System.Collections.Generic.HashSet`1.Enumerator.MoveNext()\r\n
at System.Linq.Enumerable.SelectManySingleSelectorIterator`2.MoveNext()\r\n
at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()\r\n
at System.Collections.Generic.HashSet`1.UnionWith(IEnumerable`1 other)\r\n
at System.Collections.Generic.HashSet`1..ctor(IEnumerable`1 collection, IEqualityComparer`1 comparer)\r\n
at System.Linq.Enumerable.ToHashSet[TSource](IEnumerable`1 source, IEqualityComparer`1 comparer)\r\n
-- (snip) ------------------------------------------------------------
at (snip).TableManager.GetConnectedClients(Int64 tableId)
at (snip).WebsocketProtocolFeatureImpl`1.OnPlayerFolds(Object sender, PlayerDidFoldEventArgs`1 e)
at (snip).PokerHand`1._Handle_BettingRound_PlayerDidFold(Object sender, PlayerDidFoldEventArgs`1 e)
at (snip).BettingRound`1._OnPlayerDidFold(Participant`1 p)
at (snip).BettingRound`1.Fold()
at (snip).PokerHand`1.CheckOrFold(T_PlayerId player)
at (snip).PokerHand`1.CheckOrFold()
at (snip).WebsocketProtocolFeatureImpl`1.<.ctor>b__12_1(Object sender, ElapsedEventArgs e)
-- (snip) ------------------------------------------------------------
at System.Timers.Timer.MyTimerCallback(Object state)
Внутренний итератор
|----------------------------+------------------------------------------------------------------------------------------------------------------------------------------|
| Name | Value |
|----------------------------+------------------------------------------------------------------------------------------------------------------------------------------|
| TargetSite | {Boolean MoveNext()} |
| Attributes | Public, Final, Virtual, HideBySig, NewSlot |
| CallingConvention | Standard, HasThis |
| ContainsGenericParameters | TRUE |
| CustomAttributes | Method System.Reflection.MemberInfo.get_CustomAttributes cannot be called in this context. |
| DeclaringType | {Name = "Enumerator" FullName = "System.Collections.Generic.HashSet`1+Enumerator"} |
| IsAbstract | FALSE |
| IsAssembly | FALSE |
| IsCollectible | Method System.Reflection.RuntimeMethodInfo.get_IsCollectible cannot be called in this context. |
| IsConstructedGenericMethod | Method System.Reflection.MethodBase.get_IsConstructedGenericMethod cannot be called in this context. |
| IsConstructor | FALSE |
| IsFamily | FALSE |
| IsFamilyAndAssembly | FALSE |
| IsFamilyOrAssembly | FALSE |
| IsFinal | TRUE |
| IsGenericMethod | FALSE |
| IsGenericMethodDefinition | FALSE |
| IsHideBySig | TRUE |
| IsPrivate | FALSE |
| IsPublic | TRUE |
| IsSecurityCritical | Method System.Reflection.RuntimeMethodInfo.get_IsSecurityCritical cannot be called in this context. |
| IsSecuritySafeCritical | Method System.Reflection.RuntimeMethodInfo.get_IsSecuritySafeCritical cannot be called in this context. |
| IsSecurityTransparent | Method System.Reflection.RuntimeMethodInfo.get_IsSecurityTransparent cannot be called in this context. |
| IsSpecialName | FALSE |
| IsStatic | FALSE |
| IsVirtual | TRUE |
| MemberType | Method |
| MetadataToken | 100663466 |
| MethodHandle | {System.RuntimeMethodHandle} |
| MethodImplementationFlags | Method System.Reflection.MethodBase.get_MethodImplementationFlags cannot be called in this context. |
| Module | {System.Collections.dll} |
| Name | "MoveNext" |
| ReflectedType | '((System.Reflection.RuntimeMethodInfo)($exception).TargetSite).ReflectedType' threw an exception of type 'System.NotSupportedException' |
| ReturnParameter | {System.Boolean } |
| ReturnType | {Name = "Boolean" FullName = "System.Boolean"} |
| ReturnTypeCustomAttributes | Method System.Reflection.RuntimeMethodInfo.get_ReturnTypeCustomAttributes cannot be called in this context. |
| Non-Public members | |
|----------------------------+------------------------------------------------------------------------------------------------------------------------------------------|