コード例 #1
0
        public ServerEventsClient Start()
        {
            if (log.IsDebugEnabled)
            {
                log.DebugFormat("Start()");
            }

            stopped = false;
            httpReq = (HttpWebRequest)WebRequest.Create(EventStreamUri);
            //share auth cookies
            httpReq.CookieContainer          = ((IHasCookieContainer)ServiceClient).CookieContainer;
            httpReq.AllowReadStreamBuffering = false;

            EventStreamRequestFilter?.Invoke(httpReq);

            response = (HttpWebResponse)PclExport.Instance.GetResponse(httpReq);
            var stream = response.GetResponseStream();

            buffer = new byte[BufferSize];
            cancel = new CancellationTokenSource();

            //maintain existing tcs so reconnecting is transparent
            if (connectTcs == null || connectTcs.Task.IsCompleted)
            {
                connectTcs = new TaskCompletionSource <ServerEventConnect>();
            }
            if (commandTcs == null || commandTcs.Task.IsCompleted)
            {
                commandTcs = new TaskCompletionSource <ServerEventCommand>();
            }
            if (heartbeatTcs == null || heartbeatTcs.Task.IsCompleted)
            {
                heartbeatTcs = new TaskCompletionSource <ServerEventHeartbeat>();
            }
            if (messageTcs == null || messageTcs.Task.IsCompleted)
            {
                messageTcs = new TaskCompletionSource <ServerEventMessage>();
            }

            LastPulseAt = DateTime.UtcNow;
            if (log.IsDebugEnabled)
            {
                log.Debug("[SSE-CLIENT] LastPulseAt: " + DateTime.UtcNow.TimeOfDay);
            }

            ProcessResponse(stream);

            return(this);
        }
コード例 #2
0
        public ServerEventsClient Start()
        {
            if (log.IsDebugEnabled)
            {
                log.DebugFormat("Start()");
            }

            if (Interlocked.CompareExchange(ref status, 0, 0) == WorkerStatus.Disposed)
            {
                throw new ObjectDisposedException(GetType().Name + " has been disposed");
            }

            if (Interlocked.CompareExchange(ref status, 0, 0) == WorkerStatus.Started)
            {
                return(this);
            }

            if (Interlocked.CompareExchange(ref status, WorkerStatus.Starting, WorkerStatus.Stopped) == WorkerStatus.Stopped ||
                Interlocked.CompareExchange(ref status, WorkerStatus.Starting, WorkerStatus.Stopping) == WorkerStatus.Stopping)
            {
                Interlocked.Increment(ref timesStarted);

                httpReq = (HttpWebRequest)WebRequest.Create(EventStreamUri);
                //share auth cookies
                httpReq.CookieContainer          = ((IHasCookieContainer)ServiceClient).CookieContainer;
                httpReq.AllowReadStreamBuffering = false;

                EventStreamRequestFilter?.Invoke(httpReq);

                response = (HttpWebResponse)PclExport.Instance.GetResponse(httpReq);
                var stream = response.GetResponseStream();

                buffer = new byte[BufferSize];
                cancel = new CancellationTokenSource();

                //maintain existing tcs so reconnecting is transparent
                if (connectTcs == null || connectTcs.Task.IsCompleted)
                {
                    connectTcs = new TaskCompletionSource <ServerEventConnect>();
                }
                if (commandTcs == null || commandTcs.Task.IsCompleted)
                {
                    commandTcs = new TaskCompletionSource <ServerEventCommand>();
                }
                if (heartbeatTcs == null || heartbeatTcs.Task.IsCompleted)
                {
                    heartbeatTcs = new TaskCompletionSource <ServerEventHeartbeat>();
                }
                if (messageTcs == null || messageTcs.Task.IsCompleted)
                {
                    messageTcs = new TaskCompletionSource <ServerEventMessage>();
                }

                LastPulseAt = DateTime.UtcNow;
                if (log.IsDebugEnabled)
                {
                    log.Debug("[SSE-CLIENT] LastPulseAt: " + DateTime.UtcNow.TimeOfDay);
                }

                if (Interlocked.CompareExchange(ref status, WorkerStatus.Started, WorkerStatus.Starting) != WorkerStatus.Starting)
                {
                    return(this);
                }

                ProcessResponse(stream);
            }

            return(this);
        }