public static bool Remove(IResource resource) { if (resource.Instance == null) { return(false); } if (resources.ContainsKey(resource.Instance.Id)) { resources.Remove(resource.Instance.Id); } else { return(false); } if (resource is IStore) { stores.Remove(resource as IStore); // remove all objects associated with the store var toBeRemoved = resources.Values.Where(x => x.Instance.Store == resource); foreach (var o in toBeRemoved) { Remove(o); } StoreDisconnected?.Invoke(resource as IStore); } if (resource.Instance.Store != null) { resource.Instance.Store.Remove(resource); } resource.Destroy(); return(true); }
public static bool Remove(IResource resource) { if (resource.Instance == null) { return(false); } //lock (resourcesLock) //{ WeakReference <IResource> resourceReference; if (resources.ContainsKey(resource.Instance.Id)) { resources.TryRemove(resource.Instance.Id, out resourceReference); } else { return(false); } //} if (resource != resource.Instance.Store) { List <WeakReference <IResource> > list; if (stores.TryGetValue(resource.Instance.Store, out list)) { lock (((ICollection)list).SyncRoot) list.Remove(resourceReference); //list.TryTake(resourceReference); }//.Remove(resourceReference); } if (resource is IStore) { var store = resource as IStore; List <WeakReference <IResource> > toBeRemoved;// = stores[store]; stores.TryRemove(store, out toBeRemoved); //lock (resourcesLock) //{ // // remove all objects associated with the store // toBeRemoved = resources.Values.Where(x => // { // IResource r; // if (x.TryGetTarget(out r)) // return r.Instance.Store == resource; // else // return false; // }).ToArray(); //} foreach (var o in toBeRemoved) { IResource r; if (o.TryGetTarget(out r)) { Remove(r); } } StoreDisconnected?.Invoke(resource as IStore); } if (resource.Instance.Store != null) { resource.Instance.Store.Remove(resource); } resource.Destroy(); return(true); }