Esempio n. 1
0
        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);
        }
Esempio n. 2
0
    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);
    }