internal async Task Start() { int origin = Interlocked.CompareExchange(ref _state, _connecting, _none); if (origin == _disposed) { throw new ObjectDisposedException("This tcp socket session has been disposed when connecting."); } else if (origin != _none) { throw new InvalidOperationException("This tcp socket session is in invalid state when connecting."); } try { if (_receiveBuffer == default(ArraySegment <byte>)) { _receiveBuffer = _bufferManager.BorrowBuffer(); } _receiveBufferOffset = 0; if (Interlocked.CompareExchange(ref _state, _connected, _connecting) != _connecting) { await Close(); // connected with wrong state throw new ObjectDisposedException("This tcp socket session has been disposed after connected."); } _log.DebugFormat("Session started on [{0}] in dispatcher [{1}] with session count [{2}].", this.StartTime.ToString(@"yyyy-MM-dd HH:mm:ss.fffffff"), _dispatcher.GetType().Name, this.Server.SessionCount); bool isErrorOccurredInUserSide = false; try { await _dispatcher.OnSessionStarted(this); } catch (Exception ex) // catch all exceptions from out-side { isErrorOccurredInUserSide = true; await HandleUserSideError(ex); } if (!isErrorOccurredInUserSide) { await Process(); } else { await Close(); // user side handle tcp connection error occurred } } catch (Exception ex) // catch exceptions then log then re-throw { _log.Error(string.Format("Session [{0}] exception occurred, [{1}].", this, ex.Message), ex); await Close(); // handle tcp connection error occurred throw; } }
internal async Task Start() { int origin = Interlocked.CompareExchange(ref _state, _connecting, _none); if (origin == _disposed) { throw new ObjectDisposedException(GetType().FullName); } else if (origin != _none) { throw new InvalidOperationException("This tcp socket session has already started."); } try { _receiveBuffer = _bufferManager.BorrowBuffer(); _sessionBuffer = _bufferManager.BorrowBuffer(); _sessionBufferCount = 0; if (Interlocked.CompareExchange(ref _state, _connected, _connecting) != _connecting) { throw new ObjectDisposedException(GetType().FullName); } _log.DebugFormat("Session started on [{0}] in dispatcher [{1}] with session count [{2}].", this.StartTime.ToString(@"yyyy-MM-dd HH:mm:ss.fffffff"), _dispatcher.GetType().Name, this.Server.SessionCount); bool isErrorOccurredInUserSide = false; try { await _dispatcher.OnSessionStarted(this); } catch (Exception ex) { isErrorOccurredInUserSide = true; HandleUserSideError(ex); } if (!isErrorOccurredInUserSide) { await Process(); } else { await Close(); } } catch (Exception ex) when(ex is TimeoutException) { _log.Error(string.Format("Session [{0}] exception occurred, [{1}].", this, ex.Message), ex); await Close(); } }