示例#1
0
        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"));
        }