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); }
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); }