private async Task StartSendDeliveryTaskAsync() { while (true) { var dataToSend = await _deliveryPublisherSubscriber.DequeueAsync(_deliveryBuffer); if (dataToSend.Length == 0) { Console.WriteLine("Leaving Send Delivery Task async"); return; } try { var dt = DateTime.UtcNow; await SocketStream.WriteAsync(dataToSend); SocketStatistic.WeHaveSendEvent(dataToSend.Length); SocketStatistic.LastSendToSocketDuration = DateTime.UtcNow - dt; } catch (Exception e) { Console.WriteLine(e); Log.InvokeExceptionLog(this, e, true); Disconnect(); break; } } }
private async Task PublishDataToTrafficReaderAsync(TcpDataReader trafficReader) { try { #if NETSTANDARD2_1 var buffer = await trafficReader.AllocateBufferToWriteAsync(_cancellationToken.Token); var readSize = await SocketStream.ReadAsync(buffer, _cancellationToken.Token); while (readSize > 0) { SocketStatistic.WeHaveReceiveEvent(readSize); trafficReader.CommitWrittenData(readSize); buffer = await trafficReader.AllocateBufferToWriteAsync(_cancellationToken.Token); readSize = await SocketStream.ReadAsync(buffer, _cancellationToken.Token); } #else var buffer = await trafficReader.AllocateBufferToWriteLegacyAsync(_cancellationToken.Token); var readSize = await SocketStream.ReadAsync(buffer.buffer, buffer.start, buffer.len, _cancellationToken.Token); while (readSize > 0) { SocketStatistic.WeHaveReceiveEvent(readSize); trafficReader.CommitWrittenData(readSize); buffer = await trafficReader.AllocateBufferToWriteLegacyAsync(_cancellationToken.Token); readSize = await SocketStream.ReadAsync(buffer.buffer, buffer.start, buffer.len, _cancellationToken.Token); } #endif } catch (Exception e) { Log.InvokeExceptionLog(this, e, true); } finally { Log.InvokeInfoLog(this, "Disconnected from Traffic Reader Loop"); trafficReader.Stop(); } }
internal ValueTask StartAsync(TcpClient tcpClient, ITcpSerializer <TSocketData> tcpSerializer, object lockObject, ISocketLogInvoker log, Action <ITcpContext> disconnectedCallback, byte[] deliveryBuffer) { Log = log; _disconnectedCallback = disconnectedCallback; _lockObject = lockObject; _deliveryBuffer = deliveryBuffer; _deliveryPublisherSubscriber = new TcpSocketPublisherSubscriber(_lockObject); TcpClient = tcpClient; SocketStream = TcpClient.GetStream(); TcpSerializer = tcpSerializer; SetContextName(TcpClient.Client.RemoteEndPoint.ToString()); Connected = true; SocketStatistic = new SocketStatistic(); return(OnConnectAsync()); }
public void Disconnect() { if (_disconnectedCallback != null) { try { _disconnectedCallback(this); } catch (Exception e) { Log.InvokeExceptionLog(this, e, true); } } lock (_lockObject) { if (!Connected) { return; } Connected = false; } Log.InvokeInfoLog(this, $"Socket {ContextName} is Disconnected with Ip:{TcpClient.Client.RemoteEndPoint}. Id=" + Id); try { _cancellationToken.Cancel(true); } catch (Exception e) { Log.InvokeExceptionLog(this, e, true); } try { SocketStatistic.WeHaveDisconnect(); } catch (Exception e) { Log.InvokeExceptionLog(this, e, true); } try { SocketStream.Close(); } catch (Exception e) { Log.InvokeExceptionLog(this, e, true); } try { TcpClient.Close(); } catch (Exception e) { Log.InvokeExceptionLog(this, e, true); } try { _deliveryPublisherSubscriber.Stop(); } catch (Exception e) { Log.InvokeExceptionLog(this, e, true); } Task.Run(ProcessOnDisconnectAsync); }