diff options
Diffstat (limited to 'MediaBrowser.Controller/Entities/Folder.cs')
| -rw-r--r-- | MediaBrowser.Controller/Entities/Folder.cs | 51 |
1 files changed, 25 insertions, 26 deletions
diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index 0f090f587..97ba64772 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -107,31 +107,36 @@ namespace MediaBrowser.Controller.Entities protected void AddChildrenInternal(IEnumerable<BaseItem> children) { - foreach (var child in children) + lock (_childrenSyncLock) { - AddChildInternal(child); + var newChildren = _children.ToList(); + newChildren.AddRange(children); + _children = newChildren; } } protected void AddChildInternal(BaseItem child) { - _children.Add(child); + lock (_childrenSyncLock) + { + var newChildren = _children.ToList(); + newChildren.Add(child); + _children = newChildren; + } } protected void RemoveChildrenInternal(IEnumerable<BaseItem> children) { - lock (ChildrenSyncLock) + lock (_childrenSyncLock) { - _children = new ConcurrentBag<BaseItem>(_children.Except(children)); + _children = _children.Except(children).ToList(); } } protected void ClearChildrenInternal() { - BaseItem removed; - - while (_children.TryTake(out removed)) + lock (_childrenSyncLock) { - + _children = new List<BaseItem>(); } } @@ -508,15 +513,11 @@ namespace MediaBrowser.Controller.Entities /// <summary> /// The children /// </summary> - private ConcurrentBag<BaseItem> _children; - /// <summary> - /// The _children initialized - /// </summary> - private bool _childrenInitialized; + private IReadOnlyList<BaseItem> _children; /// <summary> /// The _children sync lock /// </summary> - protected object ChildrenSyncLock = new object(); + private readonly object _childrenSyncLock = new object(); /// <summary> /// Gets or sets the actual children. /// </summary> @@ -525,11 +526,15 @@ namespace MediaBrowser.Controller.Entities { get { - LazyInitializer.EnsureInitialized(ref _children, ref _childrenInitialized, ref ChildrenSyncLock, LoadChildrenInternal); return _children; } } + public void LoadSavedChildren() + { + _children = LoadChildrenInternal(); + } + /// <summary> /// thread-safe access to the actual children of this folder - without regard to user /// </summary> @@ -566,16 +571,15 @@ namespace MediaBrowser.Controller.Entities } } - private ConcurrentBag<BaseItem> LoadChildrenInternal() + private List<BaseItem> LoadChildrenInternal() { - return new ConcurrentBag<BaseItem>(LoadChildren()); + return LoadChildren().ToList(); } /// <summary> /// Loads our children. Validation will occur externally. /// We want this sychronous. /// </summary> - /// <returns>ConcurrentBag{BaseItem}.</returns> protected virtual IEnumerable<BaseItem> LoadChildren() { //just load our children from the repo - the library will be validated and maintained in other processes @@ -698,7 +702,7 @@ namespace MediaBrowser.Controller.Entities if (currentChildren.TryGetValue(child.Id, out currentChild)) { - currentChild.ResolveArgs = child.ResolveArgs; + currentChild.ResetResolveArgs(child.ResolveArgs); //existing item - check if it has changed if (currentChild.HasChanged(child)) @@ -760,12 +764,7 @@ namespace MediaBrowser.Controller.Entities await LibraryManager.CreateItems(newItems, cancellationToken).ConfigureAwait(false); - foreach (var item in newItems) - { - _children.Add(item); - - Logger.Debug("** " + item.Name + " Added to library."); - } + AddChildrenInternal(newItems); await ItemRepository.SaveChildren(Id, _children.Select(i => i.Id).ToList(), cancellationToken).ConfigureAwait(false); |
