private async Task ProcessRequest(WebSocketManager wsManager, int maxTicks) { using (var ws = await wsManager.AcceptWebSocketAsync()) { var sender = new WebSocketSender(ws); int ticks = 0; void TickHandler() { sender.QueueSend(GetTime()); if (maxTicks != 0 && ++ticks >= maxTicks) { sender.CloseAsync(); } } _timer.Tick += TickHandler; try { await sender.HandleCommunicationAsync(); } finally { _timer.Tick -= TickHandler; } } }
public async Task AddSocket(WebSocketManager socketManager) { WebSocket socket = await socketManager.AcceptWebSocketAsync(); if (!_sockets.Contains(socket)) { _sockets.Add(socket); } await CloseSocketWhenNeed(socket); }
public async Task DispatchAsync(WebSocketManager manager) { WebSocket socket = await manager.AcceptWebSocketAsync(); SafeSocket commonSocket = new SafeSocket(socket); Task[] senderTasks = new Task[this.senders.Count]; for (int senderIndex = 0; senderIndex < senderTasks.Length; senderIndex++) { int index = senderIndex;// careful at index ! , make copy and use it inside closure ! senderTasks[senderIndex] = Task.Run(async () => { await commonSocket.ReadAsync(); }); } }
public async Task <bool> TryOpenSocket(string origin, WebSocketManager webSocket) { if (SocketConnections.ContainsKey(origin)) { await TryCloseSocket(origin); } if (SocketConnections.TryAdd(origin, await webSocket.AcceptWebSocketAsync())) { var tokenSource = new CancellationTokenSource(); if (_socketConnectionTokens.TryAdd(origin, tokenSource)) { await Echo(SocketConnections[origin], tokenSource.Token); } return(true); } return(false); }