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 (Interlocked.CompareExchange(ref _state, _connected, _connecting) != _connecting) { await Close(false); // connected with wrong state throw new ObjectDisposedException("This tcp socket session has been disposed after connected."); } _log.DebugFormat("Session started for [{0}] on [{1}] in dispatcher [{2}] with session count [{3}].", this.RemoteEndPoint, 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(true); // 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(true); // 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 { if (Interlocked.CompareExchange(ref _state, _connected, _connecting) != _connecting) { throw new ObjectDisposedException(GetType().FullName); } _log.DebugFormat("Session started for [{0}] on [{1}] in dispatcher [{2}] with session count [{3}].", this.RemoteEndPoint, 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(); } }