1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace Utils { public class MsgTracker : IObservable<string> { public MsgTracker() { observers = new List<IObserver<string>>(); }
private List<IObserver<string>> observers;
public IDisposable Subscribe(IObserver<string> observer) { if (!observers.Contains(observer)) observers.Add(observer); return new Unsubscriber(observers, observer); }
private class Unsubscriber : IDisposable { private List<IObserver<string>> _observers; private IObserver<string> _observer;
public Unsubscriber(List<IObserver<string>> observers, IObserver<string> observer) { this._observers = observers; this._observer = observer; }
public void Dispose() { if (_observer != null && _observers.Contains(_observer)) _observers.Remove(_observer); } }
public void TrackMsg(string msg) { foreach (var observer in observers) { if (string.IsNullOrWhiteSpace(msg)) observer.OnError(new MsgUnknownException()); else observer.OnNext(msg); } } public void EndMsg() { foreach (var observer in observers.ToArray()) if (observers.Contains(observer)) observer.OnCompleted();
observers.Clear(); }
} public class MsgUnknownException : Exception { internal MsgUnknownException() { } } }
|