/// <summary> /// Quick way to connect a Subscriber port to a Publisher port. Useful connecting channels and Agents /// </summary> /// <typeparam name="T"></typeparam> /// <param name="port"></param> /// <param name="receive"></param> /// <returns></returns> public static IDisposable Connect <T>(this ISubscriberPort <T> port, IPublisherPort <T> receive) { var stub = StubFiber.StartNew(); port.Subscribe(stub, receive.Publish); return(stub); }
/// <summary> /// Subscribe with a message predicate to filter messages /// </summary> /// <typeparam name="T"></typeparam> /// <param name="port"></param> /// <param name="fiber"></param> /// <param name="receive"></param> /// <param name="filter"></param> /// <returns></returns> public static IDisposable Subscribe <T>(this ISubscriberPort <T> port, IFiber fiber, Action <T> receive, Predicate <T> filter) { Action <T> filteredReceiver = x => { if (filter(x)) { fiber.Enqueue(() => receive(x)); } }; //we use a stub fiber to force the filtering onto the publisher thread. return(port.Subscribe(StubFiber.StartNew(), filteredReceiver)); }
/// <summary> /// Subscribe with a message predicate to filter messages /// </summary> /// <typeparam name="T"></typeparam> /// <param name="port"></param> /// <param name="fiber"></param> /// <param name="receive"></param> /// <param name="filter"></param> /// <returns></returns> public static IDisposable Subscribe <T>(this IFiber fiber, ISubscriberPort <T> port, Action <T> receive, Predicate <T> filter) { void FilteredReceiver(T x) { if (filter(x)) { fiber.Enqueue(() => receive(x)); } } //we use a stub fiber to force the filtering onto the publisher thread. var stub = StubFiber.StartNew(); port.Subscribe(stub, FilteredReceiver); return(stub); }
/// <summary> /// Quick way to connect a Subscriber port to a Publisher port. Useful connecting channels and Agents /// </summary> /// <typeparam name="T"></typeparam> /// <param name="port"></param> /// <param name="fiber"></param> /// <param name="receive"></param> /// <returns></returns> public static IDisposable Connect <T>(this ISubscriberPort <T> port, IFiber fiber, IPublisherPort <T> receive) { return(port.Subscribe(StubFiber.StartNew(), x => receive.Publish(x))); }
public IFiber Build() { if (_executor == null) _executor = new Executor(); IFiber fiber; switch (_type) { case FiberType.Thread: fiber = new ThreadFiber(_executor, new TimerScheduler(), _queue, _name, true, _priority); break; case FiberType.Pool: fiber = new PoolFiber(_executor); break; case FiberType.Stub: fiber = new StubFiber(_executor); break; default: throw new ArgumentOutOfRangeException(); } return fiber; }