public IObservable<ConnectionToken> BuildConnectionToken(string host, int port, IScheduler scheduler) { return Observable.Create<ConnectionToken>(observer => { var disposable = new CompositeDisposable(); var socket = socketFactory(); var socketEvent = socketEventsFactory(); socketEvent.RemoteEndPoint = new DnsEndPoint(host, port); socketEvent.SocketClientAccessPolicyProtocol = System.Net.Sockets.SocketClientAccessPolicyProtocol.Tcp; var connectionToken = new ConnectionToken(socket, socketEvent); var disposableEventSubscription = socketEvent.Completed.Subscribe(_ => { SendNotificationToObserver(observer, socketEvent, connectionToken); }); var disposableActions = scheduler.Schedule(() => { if (!socket.ConnectAsync(socketEvent)) { SendNotificationToObserver(observer, socketEvent, connectionToken); } }); disposable.Add(disposableEventSubscription); disposable.Add(disposableActions); return disposable; }); }
public RedisTransmitter(ConnectionToken connectionToken) { if (connectionToken == null) throw new ArgumentNullException("connectionToken"); this.connectionToken = connectionToken; }
private void SendNotificationToObserver(IObserver<ConnectionToken> observer, ISocketAsyncEventArgs socketEvent, ConnectionToken connectionToken) { if (socketEvent.SocketError == SocketError.Success) { observer.OnNext(connectionToken); observer.OnCompleted(); } else { observer.OnError(new RedisException(socketEvent.SocketError)); } }