DefaultTypeManager хранит известные типы в Dictionary и List без блокировок (_knownTypesIndexes, _knownTypes). Регистрация (RegisterTypeInternal) делает _knownTypesIndexes.Add и _knownTypes.Add отдельно, а индекс берет из _knownTypes.Count.
Регистрируют типы во время исполнения: ПодключитьСценарий и классы библиотек (AttachedScriptsFactory), внешние компоненты (NativeApiLibrary, NativeApiLazyTypeResolver), GetTypeByName для COM-типов. Читают (GetTypeByName, TryGetType, GetTypeByFrameworkType, IsKnownType) все потоки без блокировок.
Если два фоновых задания зарегистрируют типы одновременно, коллекции могут испортиться, а два типа — получить один индекс, и имя будет указывать на чужой тип. Чтение параллельно с регистрацией тоже небезопасно. Нашлось при разборе гонок в сборщике покрытия (#1762, там исправлены кэши фабрик типов); на практике пока не воспроизводилось.
DefaultTypeManagerхранит известные типы вDictionaryиListбез блокировок (_knownTypesIndexes,_knownTypes). Регистрация (RegisterTypeInternal) делает_knownTypesIndexes.Addи_knownTypes.Addотдельно, а индекс берет из_knownTypes.Count.Регистрируют типы во время исполнения:
ПодключитьСценарийи классы библиотек (AttachedScriptsFactory), внешние компоненты (NativeApiLibrary,NativeApiLazyTypeResolver),GetTypeByNameдля COM-типов. Читают (GetTypeByName,TryGetType,GetTypeByFrameworkType,IsKnownType) все потоки без блокировок.Если два фоновых задания зарегистрируют типы одновременно, коллекции могут испортиться, а два типа — получить один индекс, и имя будет указывать на чужой тип. Чтение параллельно с регистрацией тоже небезопасно. Нашлось при разборе гонок в сборщике покрытия (#1762, там исправлены кэши фабрик типов); на практике пока не воспроизводилось.