private XtResult RegisterHandler <TMessage>(Action <TMessage> syncCallback = null, Func <TMessage, Task> asyncCallback = null, CancellationToken token = default) where TMessage : class, new() { Exception exception = null; // handle notifies when the server is set up eventHandle = new ManualResetEvent(false); _ = Task.Run(() => { var next = new SubscriberHandler <TMessage> ( new SubscriberSocket(), _configuration, new NetMQ.NetMQPoller(), token, syncCallback: syncCallback, asyncCallback: asyncCallback ); var(success, exception) = next.Setup(); // dispose handler when an exception was registered during setup if (exception is not null) { next.Dispose(); return; } // add subscriber to dispsables to get rid of them later lock (_concurrencyToken) { _handlers.Add(next); } // open resetevent after using setup on the handler and after the poller has started asynchronously eventHandle.Set(); }); eventHandle.WaitOne(); if (exception is not null) { return(XtResult.Failed(exception, "register-subscriber")); } return(XtResult.Success("register-subscriber")); }