public Task <IDisposable> Subscribe(TCriteria criteria, Action <TActionArg> onNextAction, Action <Exception> errorAction) { var block = new InQueueBlock <TCriteria, TActionArg>(criteria, onNextAction, errorAction); var disposable = new FridayDisposable(() => { block.MarkBlockAsNonUsable(); }); lock (actualBlocks) actualBlocks.Add(block); return(Task.FromResult <IDisposable>(disposable)); }
public IDisposable AddSubscriber(Action <TNextArg> onNextAction, Action <Exception> errorAction) { var ssi = new SingleSubscriberInfo <TNextArg>( new ReactiveActions <TNextArg>(onNextAction, errorAction)); var d = new FridayDisposable(() => { UnsubscribeSingleClient(ssi); }); lock (this) { subscribers.Add(ssi); } return(d); }
public async Task <IDisposable> Subscribe(TCriteria criteria, Action <TNextArg> onNextAction, Action <Exception> errorAction) { if (blocks.TryGetValue(criteria, out var block)) { return(block.AddSubscriber(onNextAction, errorAction)); } var newBlock = blocks.GetOrAdd(criteria, new GenericSubscribersCriteriaBlock <TCriteria, TNextArg>(criteria)); var realSubscription = await SubscribeInternal(criteria, newBlock.ProcessNext, newBlock.ProcessError).ConfigureAwait(false); var subscription = new FridayDisposable(() => { blocks.TryRemove(criteria, out _); realSubscription.Dispose(); }); newBlock.SetRealSubscription(subscription); return(newBlock.AddSubscriber(onNextAction, errorAction)); }
public static IDisposable ToDisposable(this System.Action a) { return(FridayDisposable.Create(a)); }