/// <summary> /// Subscribes to the network database /// </summary> /// <param name="observer">The obsever to subscribe</param> /// <returns>The disposable subscription instance</returns> public IDisposable Subscribe(DescriptorQuery query, IDescriptorObserver <ObjectInfo, GlobalObjectId> observer) { DescriptorSubscription ret = null; lock (_lock) { this._observers.Add(new DescriptorObserver(query, observer)); ret = new DescriptorSubscription(this, observer); } Task.Factory.StartNew(() => { lock (_lock) { var descriptors = _db.QueryObjects(query); observer.Add(descriptors); } }); return(ret); }
/// <summary> /// Disposes of a descriptor subscription, unsubscribing the observer /// </summary> /// <param name="observer">The observer to unsubscribe</param> private void _disposeDescriptorSubscription(IDescriptorObserver <ObjectInfo, GlobalObjectId> observer) { lock (_lock) { bool removed = false; for (int i = 0; i < _observers.Count; i++) { if (_observers[i].Observer == observer) { _observers.RemoveAt(i); removed = true; break; } } if (removed) { observer.Close(); } } }
/// <summary> /// Constructs a new descriptor subscription instance /// </summary> /// <param name="database">The network database</param> /// <param name="observer">The observer</param> public DescriptorSubscription(NetworkDatabase database, IDescriptorObserver <ObjectInfo, GlobalObjectId> observer) { this._database = database; this._observer = observer; }
public DescriptorObserver(DescriptorQuery query, IDescriptorObserver <ObjectInfo, GlobalObjectId> observer) : this() { this.Query = query; this.Observer = observer; }