CreateObservableMQTTClient( IClientOptions options, IWillMessage willMessage = null, params ITopicFilter[] topicFilters) { ClientOptions = options; WillMessage = willMessage; _wrappedClient = new MQTTClient(this, topicFilters); var observable = Observable.Create <IMQTTMessage>( obs => { var disposableConnect = _wrappedClient.ObservableConnect .Subscribe(_ => { }, obs.OnError, obs.OnCompleted); var disposableMessage = _wrappedClient.ObservableMessage .Subscribe( obs.OnNext, obs.OnError, obs.OnCompleted); var disposableDisconnect = _wrappedClient.ObservableDisconnect .Where(disconnect => disconnect == true) .Select(x => Observable.FromAsync(() => _wrappedClient.DisconnectAsync()).Timeout(TimeSpan.FromSeconds(5))) .Concat() .Subscribe(d => { Debug.WriteLine("Disconnected"); obs.OnCompleted(); }, obs.OnError, obs.OnCompleted); return(new CompositeDisposable( disposableMessage, disposableConnect, disposableDisconnect)); }) .FinallyAsync(async() => { await _wrappedClient?.DisconnectAsync(); }) .Publish().RefCount(); return(observable, _wrappedClient); }