private async Task Connect(CancellationToken cancellationToken) { await Task.Yield(); try { while (true) { var proxy = new ProducerProxy(_stateManager); await using (Stream = await _streamFactory.CreateStream(proxy, cancellationToken)) { proxy.Connected(); await _stateManager.StateChangedFrom(ProducerState.Connected, cancellationToken); if (_stateManager.IsFinalState()) { return; } } } } catch (OperationCanceledException) { HasClosed(); } catch (Exception exception) { HasFaulted(exception); } }
public Producer(IProducerStreamFactory streamFactory, IFaultStrategy faultStrategy) { _executor = new Executor(ExecutorOnException); _streamFactory = streamFactory; _faultStrategy = faultStrategy; _stateManager = new StateManager <ProducerState>(ProducerState.Disconnected, ProducerState.Closed, ProducerState.Faulted); _connectTokenSource = new CancellationTokenSource(); Stream = new NotReadyStream(); _connectTask = Connect(_connectTokenSource.Token); _throwIfClosedOrFaulted = () => { }; }