public override void Dispose()
        {
            lock (_lock)
            {
                if (_isDisposed) return;
                _isDisposed = true;
                ReTransmitNonx200FinalResponseTimer.Dispose();
                EndConfirmedTimer.Dispose();
                EndCompletedTimer.Dispose();
                SendTryingTimer.Dispose();

                SipAbstractServerTransaction tx;
                _table.TryRemove(this.GetId(), out tx);

                 _state = TerminatedState;
            }

            if (_stateObserver != null)
            {
                _stateObserver.OnNext(CreateStateInfo(_state.Name));
                _stateObserver.OnCompleted();
            }
        }
        internal void ChangeState(AbstractStxState newstate)
        {
            /*attention: no locking. Is already called thread safely via call to SendResponse */
            _state = newstate;
            newstate.Initialize(this);

            if (_stateObserver != null) _stateObserver.OnNext(CreateStateInfo(newstate.Name));
        }