private RdCall <TIn, TOut> CreateEndpoint <TIn, TOut>(Func <TIn, TOut> handler) { var res = new RdCall <TIn, TOut>(); res.Set(handler); return(res); }
private RdCall <TIn, TOut> CreateEndpoint <TIn, TOut>(Func <TIn, TOut> handler, IScheduler cancellationScheduler = null, IScheduler handlerScheduler = null) { var res = new RdCall <TIn, TOut>(); res.Set(handler, cancellationScheduler, handlerScheduler); return(res); }
public void TestBindable() { ClientWire.AutoTransmitMode = true; ServerWire.AutoTransmitMode = true; var call1 = new RdCall <Unit, RdSignal <int> >(Serializers.ReadVoid, Serializers.WriteVoid, RdSignal <int> .Read, RdSignal <int> .Write); var call2 = new RdCall <Unit, RdSignal <int> >(Serializers.ReadVoid, Serializers.WriteVoid, RdSignal <int> .Read, RdSignal <int> .Write); var respSignal = new RdSignal <int>(); var endpointLfTerminated = false; call2.Set((endpointLf, _) => { endpointLf.OnTermination(() => endpointLfTerminated = true); return(RdTask <RdSignal <int> > .Successful(respSignal)); }); var serverEntity = BindToServer(LifetimeDefinition.Lifetime, call1, ourKey); var clientEntity = BindToClient(LifetimeDefinition.Lifetime, call2, ourKey); var ld = new LifetimeDefinition(); var lf = ld.Lifetime; var signal = call1.Start(lf, Unit.Instance).AsTask().GetOrWait(lf); var log = new List <int>(); signal.Advise(Lifetime.Eternal, v => { log.Add(v); Console.WriteLine(v); }); respSignal.Fire(1); respSignal.Fire(2); respSignal.Fire(3); ld.Terminate(); Assert.False(respSignal.IsBound); SpinWaitEx.SpinUntil(() => log.Count >= 3); Thread.Sleep(100); Assert.AreEqual(new [] { 1, 2, 3 }, log.ToArray()); Assert.True(endpointLfTerminated); }
/// <summary> /// Wrapper method to simplify search with overload resolution for two methods in RdEndpoint /// </summary> public static void SetHandler <TReq, TRes>(RdCall <TReq, TRes> endpoint, Func <Lifetime, TReq, RdTask <TRes> > handler) { endpoint.Set(handler); }
/// <summary> /// Wrapper method to simplify search with overload resolution for two methods in RdEndpoint /// </summary> public static void SetHandlerTaskVoid <TReq>(RdCall <TReq, Unit> endpoint, Func <Lifetime, TReq, Task> handler) { endpoint.Set((lt, req) => handler(lt, req).ToRdTask()); }
/// <summary> /// Wrapper method to simplify search with overload resolution for two methods in RdEndpoint. /// /// Used for sync calls only. /// </summary> public static void SetHandler <TReq, TRes>(RdCall <TReq, TRes> endpoint, Func <Lifetime, TReq, RdTask <TRes> > handler) { endpoint.Set(handler, null, new SwitchingScheduler(endpoint)); }