public ISubscription Subscribe(Action <string> messageReceivedAction) { var tokenSource = new CancellationTokenSource(); SafeExecute.Sync(() => ThreadPool.QueueUserWorkItem(s => { var cancellationToken = (CancellationToken)s; while (!cancellationToken.IsCancellationRequested) { SafeExecute.SyncCatch( () => PollMessage(messageReceivedAction, cancellationToken), () => Thread.Sleep(_options.WaitDuration)); } }, tokenSource.Token)); return(new DefaultSubscription(() => tokenSource.Cancel())); }
private void PollMessage(Action <string> messageReceivedAction, CancellationToken cancellationToken) { while (!cancellationToken.IsCancellationRequested) { SafeExecute.SyncCatch(() => { var link = GetLink(); var message = link.Receive(TimeSpan.FromMilliseconds(_options.PollingInterval)); if (message == null) { Thread.Sleep(_options.WaitDuration); return; } link.Accept(message); messageReceivedAction.Invoke((string)message.Body); }, () => Thread.Sleep(_options.WaitDuration)); } }