private async ValueTask OpenSocket(CancellationToken cancellationToken = default) { if (socket is object) { return; } using var cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); await socketSemaphore.WaitAsync(-1, cts.Token); try { while (socket is null && !cts.Token.IsCancellationRequested) { try { socket = factory.RequesterOpen().ThenDial(uri).Unwrap(); socketConfigurator?.Invoke(socket); }catch (NngException exception) { if (exception.ErrorCode == nng.Native.Defines.NNG_ECONNREFUSED) { await Task.Delay(100, cts.Token); } else { throw; } } } } finally { socketSemaphore.Release(); } }
public string Get(string id) { IReqSocket client = _factory.Create(); try { return(client.SendRequest(id)); } finally { _factory.Release(client); } }
private void RequestThread(object clientFactory) { IReqSocket client = null; try { client = ((ClientFactory)clientFactory).Create(); Console.WriteLine("Client connected."); string response = client.SendRequest(string.Format("Request #{0}", Thread.CurrentThread.ManagedThreadId)); Console.WriteLine(response); Assert.AreEqual(string.Format("Reply (Request #{0})", Thread.CurrentThread.ManagedThreadId), response); } finally { if (client != null) { ((ClientFactory)clientFactory).Release(client); } } }
public static NngResult <IReqRepAsyncContext <T> > CreateAsyncContext <T>(this IReqSocket socket, IAPIFactory <T> factory) => factory.CreateReqRepAsyncContext(socket);
public void Release(IReqSocket instance) { ((ReqSocket)instance).Dispose(); }
public static NngResult <IReqRepAsyncContext <T> > Create(IMessageFactory <T> factory, IReqSocket socket) { var context = new ReqAsyncCtx <T> { Factory = factory, socket = socket }; var res = context.InitAio(); if (res.IsOk()) { //TODO: when get default interface methods in C#8 move this to ICtx var ctx = NngCtx.Create(socket); if (ctx.IsOk()) { context.Ctx = ctx.Ok(); return(NngResult <IReqRepAsyncContext <T> > .Ok(context)); } return(NngResult <IReqRepAsyncContext <T> > .Err(ctx.Err())); } else { return(NngResult <IReqRepAsyncContext <T> > .Fail(res.Err())); } }
public NngResult <IReqRepAsyncContext <INngMsg> > CreateReqRepAsyncContext(IReqSocket socket) { return(ReqAsyncCtx <INngMsg> .Create(this, socket)); }