Запрос Linq в однопоточном процессе вызывает исключение InvalidOperationException - PullRequest
0 голосов
/ 01 ноября 2019

В предыдущем вопросе Я попросил помочь изменить фрагмент кода на Linq. Сегодня этот запрос выдал неожиданное System.InvalidOperationException с сообщением Коллекция была изменена после создания экземпляра перечислителя , что удивляет меня, потому что приложение запускается однопоточным.

Снимок экрана

Exception Screenshot

Обзор архитектуры системы

Приложение принимает соединения, используя 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         |                                                                                                                                          |
|----------------------------+------------------------------------------------------------------------------------------------------------------------------------------|

...