public async Task SubscribeAsync(CancellationToken cancellationToken) { if (_isSubscribing) { throw new InvalidOperationException("Already subscribing."); } _isSubscribing = true; var tasks = new List <Task>(); // One subscription listener for each region. foreach (var subStreamId in _options.SubscriptionStreamIds) { tasks.Add(_subscriptionListener.ListenAsync(subStreamId.RegionId, subStreamId.StreamId, cancellationToken)); } tasks.Add(_resolutionManager.ManageAsync(cancellationToken)); tasks.Add(_sortingManager.ManageAsync(cancellationToken)); tasks.Add(_handlingManager.ManageAsync(cancellationToken)); tasks.Add(cancellationToken.WaitHandle.AsTask()); await Task.WhenAny(tasks); _isSubscribing = false; }