public bool UnInitialize() { TracerHelper.TraceEntry(); SortedList <int, List <PlatformComponent> > componentsByLevel; lock (this) { componentsByLevel = GetComponentsByLevel(_components.Values); } // Un initialize higher level components first. // Make sure component uninit is outside of locks, to evade dead locks. for (int i = 0; i < componentsByLevel.Keys.Count; i++) { int level = componentsByLevel.Keys[i]; foreach (PlatformComponent component in componentsByLevel[level]) { UnInitializeComponent(component); } } lock (this) { // Store additional. _serializationData.Clear(); _serializationData.AddValue("diagnosticsMode", _settings.DiagnosticsMode); _serializationData.AddValue("uiSerializationInfo", _uiSerializationInfo); _serializationData.AddValue("componentSpecificSerializationInfo", _componentSpecificSerializationInfo); PersistenceHelper.UpdateToDB <Platform>(this, null); _components.Clear(); this.Arbiter.Dispose(); } return(true); }