diff --git a/GFramework.Core.Abstractions/state/IStateMachine.cs b/GFramework.Core.Abstractions/state/IStateMachine.cs index fa3c1303..53b09edd 100644 --- a/GFramework.Core.Abstractions/state/IStateMachine.cs +++ b/GFramework.Core.Abstractions/state/IStateMachine.cs @@ -17,25 +17,12 @@ public interface IStateMachine /// 要注册的状态实例 IStateMachine Register(IState state); - /// - /// 从状态机中注销指定类型的状态 - /// - /// 要注销的状态类型,必须实现IState接口 - IStateMachine Unregister() where T : IState; - /// /// 异步从状态机中注销指定类型的状态 /// /// 要注销的状态类型,必须实现IState接口 Task UnregisterAsync() where T : IState; - /// - /// 检查是否可以切换到指定类型的状态 - /// - /// 目标状态类型,必须实现IState接口 - /// 如果可以切换则返回true,否则返回false - bool CanChangeTo() where T : IState; - /// /// 异步检查是否可以切换到指定类型的状态 /// @@ -43,13 +30,6 @@ public interface IStateMachine /// 如果可以切换则返回true,否则返回false Task CanChangeToAsync() where T : IState; - /// - /// 切换到指定类型的状态 - /// - /// 要切换到的状态类型,必须实现IState接口 - /// 如果成功切换则返回true,否则返回false - bool ChangeTo() where T : IState; - /// /// 异步切换到指定类型的状态 /// @@ -89,12 +69,6 @@ public interface IStateMachine /// 状态历史记录的只读副本 IReadOnlyList GetStateHistory(); - /// - /// 回退到上一个状态 - /// - /// 如果成功回退则返回true,否则返回false - bool GoBack(); - /// /// 异步回退到上一个状态 /// diff --git a/GFramework.Core.Tests/state/StateMachineSystemTests.cs b/GFramework.Core.Tests/state/StateMachineSystemTests.cs index 6e8a75fd..479be46a 100644 --- a/GFramework.Core.Tests/state/StateMachineSystemTests.cs +++ b/GFramework.Core.Tests/state/StateMachineSystemTests.cs @@ -151,126 +151,6 @@ public void OnArchitecturePhase_Should_Not_Throw_Exception() Throws.Nothing); } - /// - /// 测试ChangeTo发送StateChangedEvent事件 - /// 验证当状态机切换到新状态时,会正确触发StateChangedEvent事件,并且事件中的旧状态为null(首次切换) - /// - [Test] - public void ChangeTo_Should_Send_StateChangedEvent() - { - // 订阅StateChangedEvent事件以验证事件是否被正确发送 - var eventReceived = false; - StateChangedEvent? receivedEvent = null; - - _eventBus!.Register(e => - { - eventReceived = true; - receivedEvent = e; - }); - - var state1 = new TestStateV5(); - var state2 = new TestStateV5(); - - _stateMachine!.Register(state1); - _stateMachine.Register(state2); - - _stateMachine.Init(); - _stateMachine.ChangeTo(); - - Assert.That(eventReceived, Is.True); - Assert.That(receivedEvent!.OldState, Is.Null); - Assert.That(receivedEvent.NewState, Is.InstanceOf()); - } - - /// - /// 测试ChangeTo发送StateChangedEvent事件(包含旧状态) - /// 验证当状态机从一个状态切换到另一个状态时,会正确触发StateChangedEvent事件, - /// 并且事件中包含正确的旧状态和新状态信息 - /// - [Test] - public void ChangeTo_Should_Send_StateChangedEvent_With_OldState() - { - // 订阅StateChangedEvent事件以验证事件是否被正确发送 - var eventReceived = false; - StateChangedEvent? receivedEvent = null; - - _eventBus!.Register(e => - { - eventReceived = true; - receivedEvent = e; - }); - - var state1 = new TestStateV5(); - var state2 = new TestStateV5(); - - _stateMachine!.Register(state1); - _stateMachine.Register(state2); - - _stateMachine.Init(); - _stateMachine.ChangeTo(); - _stateMachine.ChangeTo(); - - Assert.That(eventReceived, Is.True); - Assert.That(receivedEvent!.OldState, Is.InstanceOf()); - Assert.That(receivedEvent.NewState, Is.InstanceOf()); - } - - /// - /// 测试CanChangeTo方法对于已注册状态的工作情况 - /// 验证当状态已注册到状态机中时,CanChangeTo方法应返回true - /// - [Test] - public void CanChangeTo_Should_Work_With_Registered_States() - { - var state = new TestStateV5(); - - _stateMachine!.Register(state); - - var canChange = _stateMachine.CanChangeTo(); - Assert.That(canChange, Is.True); - } - - /// - /// 测试可以注册多个状态 - /// 验证状态机能够成功注册多个不同的状态实例,并且能够切换到这些已注册的状态 - /// - [Test] - public void Multiple_States_Should_Be_Registered() - { - var state1 = new TestStateV5 { Id = 1 }; - var state2 = new TestStateV5 { Id = 2 }; - var state3 = new TestStateV5 { Id = 3 }; - - _stateMachine!.Register(state1); - _stateMachine.Register(state2); - _stateMachine.Register(state3); - - var canChange = _stateMachine.CanChangeTo(); - Assert.That(canChange, Is.True); - } - - - /// - /// 测试状态机生命周期完整 - /// - [Test] - public void StateMachine_Lifecycle_Should_Be_Complete() - { - var state1 = new TestStateV5(); - var state2 = new TestStateV5(); - - _stateMachine!.Register(state1); - _stateMachine.Register(state2); - - _stateMachine.Init(); - Assert.That(_stateMachine.Current, Is.Null); - - _stateMachine.ChangeTo(); - Assert.That(_stateMachine.Current, Is.InstanceOf()); - - _stateMachine.Destroy(); - } - /// /// 测试异步ChangeToAsync发送StateChangedEvent事件 /// 验证当状态机使用异步方法切换到新状态时,会正确触发StateChangedEvent事件 diff --git a/GFramework.Core.Tests/state/StateMachineTests.cs b/GFramework.Core.Tests/state/StateMachineTests.cs index 7542ac60..440c436c 100644 --- a/GFramework.Core.Tests/state/StateMachineTests.cs +++ b/GFramework.Core.Tests/state/StateMachineTests.cs @@ -43,204 +43,6 @@ public void Register_Should_AddState_To_StatesDictionary() Assert.That(_stateMachine.ContainsState(), Is.True); } - /// - /// 验证ChangeTo方法能够正确设置当前状态 - /// - [Test] - public void ChangeTo_Should_SetCurrentState() - { - var state = new TestStateV2(); - _stateMachine.Register(state); - _stateMachine.ChangeTo(); - - Assert.That(_stateMachine.Current, Is.SameAs(state)); - } - - /// - /// 验证ChangeTo方法会调用OnEnter回调 - /// - [Test] - public void ChangeTo_Should_Invoke_OnEnter() - { - var state = new TestStateV2(); - _stateMachine.Register(state); - _stateMachine.ChangeTo(); - - Assert.That(state.EnterCalled, Is.True); - Assert.That(state.EnterFrom, Is.Null); - } - - /// - /// 验证当存在当前状态时,切换到新状态会调用原状态的OnExit回调 - /// - [Test] - public void ChangeTo_When_CurrentStateExists_Should_Invoke_OnExit() - { - var state1 = new TestStateV2(); - var state2 = new TestStateV3(); - _stateMachine.Register(state1); - _stateMachine.Register(state2); - - _stateMachine.ChangeTo(); - _stateMachine.ChangeTo(); - - Assert.That(state1.ExitCalled, Is.True); - Assert.That(state1.ExitTo, Is.SameAs(state2)); - } - - /// - /// 验证当存在当前状态时,切换到新状态会调用新状态的OnEnter回调 - /// - [Test] - public void ChangeTo_When_CurrentStateExists_Should_Invoke_OnEnter() - { - var state1 = new TestStateV2(); - var state2 = new TestStateV3(); - _stateMachine.Register(state1); - _stateMachine.Register(state2); - - _stateMachine.ChangeTo(); - _stateMachine.ChangeTo(); - - Assert.That(state2.EnterCalled, Is.True); - Assert.That(state2.EnterFrom, Is.SameAs(state1)); - } - - /// - /// 验证切换到相同状态时不应调用回调方法 - /// - [Test] - public void ChangeTo_ToSameState_Should_NotInvoke_Callbacks() - { - var state = new TestStateV2(); - _stateMachine.Register(state); - _stateMachine.ChangeTo(); - - var enterCount = state.EnterCallCount; - var exitCount = state.ExitCallCount; - - _stateMachine.ChangeTo(); - - Assert.That(state.EnterCallCount, Is.EqualTo(enterCount)); - Assert.That(state.ExitCallCount, Is.EqualTo(exitCount)); - } - - /// - /// 验证切换到未注册状态时应抛出InvalidOperationException异常 - /// - [Test] - public void ChangeTo_ToUnregisteredState_Should_ThrowInvalidOperationException() - { - Assert.Throws(() => _stateMachine.ChangeTo()); - } - - /// - /// 验证当状态未注册时CanChangeTo方法应返回false - /// - [Test] - public void CanChangeTo_WhenStateNotRegistered_Should_ReturnFalse() - { - var result = _stateMachine.CanChangeTo(); - Assert.That(result, Is.False); - } - - /// - /// 验证当状态已注册时CanChangeTo方法应返回true - /// - [Test] - public void CanChangeTo_WhenStateRegistered_Should_ReturnTrue() - { - var state = new TestStateV2(); - _stateMachine.Register(state); - - var result = _stateMachine.CanChangeTo(); - Assert.That(result, Is.True); - } - - /// - /// 验证当当前状态拒绝转换时CanChangeTo方法应返回false - /// - [Test] - public void CanChangeTo_WhenCurrentStateDeniesTransition_Should_ReturnFalse() - { - var state1 = new TestStateV2 { AllowTransition = false }; - var state2 = new TestStateV3(); - _stateMachine.Register(state1); - _stateMachine.Register(state2); - _stateMachine.ChangeTo(); - - var result = _stateMachine.CanChangeTo(); - Assert.That(result, Is.False); - } - - /// - /// 验证当当前状态拒绝转换时不应发生状态变化 - /// - [Test] - public void ChangeTo_WhenCurrentStateDeniesTransition_Should_NotChange() - { - var state1 = new TestStateV2 { AllowTransition = false }; - var state2 = new TestStateV3(); - _stateMachine.Register(state1); - _stateMachine.Register(state2); - _stateMachine.ChangeTo(); - - var oldState = _stateMachine.Current; - var result = _stateMachine.ChangeTo(); - - Assert.That(result, Is.False); - Assert.That(_stateMachine.Current, Is.SameAs(oldState)); - Assert.That(_stateMachine.Current, Is.SameAs(state1)); - Assert.That(state2.EnterCalled, Is.False); - } - - /// - /// 验证注销状态后应从字典中移除该状态 - /// - [Test] - public void Unregister_Should_RemoveState_FromDictionary() - { - var state = new TestStateV2(); - _stateMachine.Register(state); - _stateMachine.Unregister(); - - Assert.That(_stateMachine.ContainsState(), Is.False); - } - - /// - /// 验证当活动状态被注销时应调用OnExit并清除当前状态 - /// - [Test] - public void Unregister_WhenStateIsActive_Should_Invoke_OnExit_AndClearCurrent() - { - var state = new TestStateV2(); - _stateMachine.Register(state); - _stateMachine.ChangeTo(); - _stateMachine.Unregister(); - - Assert.That(state.ExitCalled, Is.True); - Assert.That(state.ExitTo, Is.Null); - Assert.That(_stateMachine.Current, Is.Null); - } - - /// - /// 验证当非活动状态被注销时不应调用OnExit - /// - [Test] - public void Unregister_WhenStateNotActive_Should_Not_Invoke_OnExit() - { - var state1 = new TestStateV2(); - var state2 = new TestStateV3(); - _stateMachine.Register(state1); - _stateMachine.Register(state2); - _stateMachine.ChangeTo(); - - _stateMachine.Unregister(); - - Assert.That(state1.ExitCalled, Is.False); - Assert.That(_stateMachine.Current, Is.SameAs(state1)); - } - /// /// 验证异步注销后状态应从字典中移除 /// @@ -254,21 +56,6 @@ public async Task UnregisterAsync_Should_RemoveState_FromDictionary() Assert.That(_stateMachine.ContainsState(), Is.False); } - /// - /// 验证异步注销活动同步状态时调用OnExit - /// - [Test] - public async Task UnregisterAsync_WhenStateIsActive_WithSyncState_Should_Invoke_OnExit() - { - var state = new TestStateV2(); - _stateMachine.Register(state); - _stateMachine.ChangeTo(); - await _stateMachine.UnregisterAsync(); - - Assert.That(state.ExitCalled, Is.True); - Assert.That(state.ExitTo, Is.Null); - Assert.That(_stateMachine.Current, Is.Null); - } /// /// 验证异步注销活动异步状态时调用OnExitAsync @@ -286,24 +73,6 @@ public async Task UnregisterAsync_WhenStateIsActive_WithAsyncState_Should_Invoke Assert.That(_stateMachine.Current, Is.Null); } - /// - /// 验证异步注销非活动状态不调用退出方法 - /// - [Test] - public async Task UnregisterAsync_WhenStateNotActive_Should_Not_Invoke_Exit() - { - var state1 = new TestStateV2(); - var state2 = new TestStateV3(); - _stateMachine.Register(state1); - _stateMachine.Register(state2); - _stateMachine.ChangeTo(); - - await _stateMachine.UnregisterAsync(); - - Assert.That(state1.ExitCalled, Is.False); - Assert.That(_stateMachine.Current, Is.SameAs(state1)); - } - /// /// 验证异步切换检查未注册状态返回false /// @@ -327,21 +96,6 @@ public async Task CanChangeToAsync_WhenStateRegistered_Should_ReturnTrue() Assert.That(result, Is.True); } - /// - /// 验证异步切换检查当前状态拒绝转换时返回false - /// - [Test] - public async Task CanChangeToAsync_WhenCurrentStateDeniesTransition_Should_ReturnFalse() - { - var state1 = new TestStateV2 { AllowTransition = false }; - var state2 = new TestStateV3(); - _stateMachine.Register(state1); - _stateMachine.Register(state2); - _stateMachine.ChangeTo(); - - var result = await _stateMachine.CanChangeToAsync(); - Assert.That(result, Is.False); - } /// /// 验证异步切换检查使用异步状态时调用CanTransitionToAsync @@ -359,21 +113,6 @@ public async Task CanChangeToAsync_WithAsyncState_Should_Call_CanTransitionToAsy Assert.That(state1.CanTransitionToCallCount, Is.EqualTo(1)); } - /// - /// 验证异步切换检查使用同步状态时调用CanTransitionTo - /// - [Test] - public async Task CanChangeToAsync_WithSyncState_Should_Call_CanTransitionTo() - { - var state1 = new TestStateV2 { AllowTransition = false }; - var state2 = new TestStateV3(); - _stateMachine.Register(state1); - _stateMachine.Register(state2); - _stateMachine.ChangeTo(); - - var result = await _stateMachine.CanChangeToAsync(); - Assert.That(result, Is.False); - } /// /// 验证异步状态切换能够正确设置当前状态 @@ -628,52 +367,6 @@ public async Task MultipleAsyncStateChanges_Should_Invoke_Callbacks_Correctly() Assert.That(state3.EnterCalled, Is.True); Assert.That(state3.ExitCalled, Is.False); } - - /// - /// 验证多次状态转换应正确调用回调方法 - /// - [Test] - public void MultipleStateChanges_Should_Invoke_Callbacks_Correctly() - { - var state1 = new TestStateV2(); - var state2 = new TestStateV3(); - var state3 = new TestStateV4(); - _stateMachine.Register(state1); - _stateMachine.Register(state2); - _stateMachine.Register(state3); - - _stateMachine.ChangeTo(); - _stateMachine.ChangeTo(); - _stateMachine.ChangeTo(); - - Assert.That(state1.EnterCalled, Is.True); - Assert.That(state1.ExitCalled, Is.True); - Assert.That(state2.EnterCalled, Is.True); - Assert.That(state2.ExitCalled, Is.True); - Assert.That(state3.EnterCalled, Is.True); - Assert.That(state3.ExitCalled, Is.False); - } - - /// - /// 验证ChangeTo方法应遵循CanTransitionTo逻辑 - /// - [Test] - public void ChangeTo_Should_Respect_CanTransitionTo_Logic() - { - var state1 = new TestStateV2(); - var state2 = new TestStateV3(); - var state3 = new TestStateV4(); - _stateMachine.Register(state1); - _stateMachine.Register(state2); - _stateMachine.Register(state3); - - _stateMachine.ChangeTo(); - _stateMachine.ChangeTo(); - - Assert.That(state1.EnterCalled, Is.True); - Assert.That(state1.ExitCalled, Is.True); - Assert.That(state2.EnterCalled, Is.True); - } } /// diff --git a/GFramework.Core/state/StateMachine.cs b/GFramework.Core/state/StateMachine.cs index 4ffd820c..45c6bcff 100644 --- a/GFramework.Core/state/StateMachine.cs +++ b/GFramework.Core/state/StateMachine.cs @@ -9,8 +9,10 @@ namespace GFramework.Core.state; public class StateMachine(int maxHistorySize = 10) : IStateMachine { private readonly object _lock = new(); - private readonly HashSet _registeredStates = new(); // 优化:用于快速检查状态是否注册 + + private readonly HashSet _registeredStates = []; private readonly Stack _stateHistory = new(); + private readonly SemaphoreSlim _transitionLock = new(1, 1); /// /// 存储所有已注册状态的字典,键为状态类型,值为状态实例 @@ -37,57 +39,31 @@ public IStateMachine Register(IState state) return this; } - /// - /// 从状态机中注销指定类型的状态 - /// - /// 要注销的状态类型 - public IStateMachine Unregister() where T : IState - { - var stateToUnregister = PrepareUnregister(out var isCurrentState); - if (stateToUnregister == null) return this; - - // 如果是当前状态,执行同步退出 - if (isCurrentState) - { - Current!.OnExit(null); - Current = null; - } - - CompleteUnregister(stateToUnregister); - return this; - } - /// /// 异步注销指定类型的状态 /// /// 要注销的状态类型 public async Task UnregisterAsync() where T : IState { - var stateToUnregister = PrepareUnregister(out var isCurrentState); - if (stateToUnregister == null) return this; - - // 如果是当前状态,执行异步退出 - if (isCurrentState) + await _transitionLock.WaitAsync(); + try { - await ExecuteExitAsync(Current!, null); - Current = null; - } - - CompleteUnregister(stateToUnregister); - return this; - } + var stateToUnregister = PrepareUnregister(out var isCurrentState); + if (stateToUnregister == null) return this; - /// - /// 检查是否可以切换到指定类型的状态 - /// - /// 目标状态类型 - /// 如果可以切换则返回true,否则返回false - public bool CanChangeTo() where T : IState - { - if (!States.TryGetValue(typeof(T), out var target)) - return false; + if (isCurrentState) + { + await ExecuteExitAsync(Current!, null); + Current = null; + } - return Current?.CanTransitionTo(target) ?? true; + CompleteUnregister(stateToUnregister); + return this; + } + finally + { + _transitionLock.Release(); + } } /// @@ -97,38 +73,23 @@ public bool CanChangeTo() where T : IState /// 如果可以切换则返回true,否则返回false public async Task CanChangeToAsync() where T : IState { - if (!States.TryGetValue(typeof(T), out var target)) - return false; - - if (Current == null) return true; - - return await CanTransitionToAsync(Current, target); - } - - /// - /// 切换到指定类型的状态 - /// - /// 目标状态类型 - /// 如果成功切换则返回true,否则返回false - /// 当目标状态未注册时抛出 - public bool ChangeTo() where T : IState - { - lock (_lock) + await _transitionLock.WaitAsync(); + try { if (!States.TryGetValue(typeof(T), out var target)) - throw new InvalidOperationException($"State {typeof(T).Name} not registered."); - - if (Current != null && !Current.CanTransitionTo(target)) - { - OnTransitionRejected(Current, target); return false; - } - ChangeInternal(target); - return true; + if (Current == null) return true; + + return await CanTransitionToAsync(Current, target); + } + finally + { + _transitionLock.Release(); } } + /// /// 异步切换到指定类型的状态 /// @@ -137,30 +98,37 @@ public bool ChangeTo() where T : IState /// 当目标状态未注册时抛出 public async Task ChangeToAsync() where T : IState { - IState target; - IState? currentSnapshot; - - lock (_lock) + await _transitionLock.WaitAsync(); + try { - if (!States.TryGetValue(typeof(T), out target!)) - throw new InvalidOperationException($"State {typeof(T).Name} not registered."); + IState target; + IState? currentSnapshot; - currentSnapshot = Current; // 在锁内获取当前状态的快照 - } + lock (_lock) + { + if (!States.TryGetValue(typeof(T), out target!)) + throw new InvalidOperationException($"State {typeof(T).Name} not registered."); - // 验证转换(在锁外执行异步操作) - if (currentSnapshot != null) - { - var canTransition = await CanTransitionToAsync(currentSnapshot, target); - if (!canTransition) + currentSnapshot = Current; + } + + if (currentSnapshot != null) { - await OnTransitionRejectedAsync(currentSnapshot, target); - return false; + var canTransition = await CanTransitionToAsync(currentSnapshot, target); + if (!canTransition) + { + await OnTransitionRejectedAsync(currentSnapshot, target); + return false; + } } - } - await ChangeInternalAsync(target); - return true; + await ChangeInternalAsync(target); + return true; + } + finally + { + _transitionLock.Release(); + } } /// @@ -216,30 +184,25 @@ public IReadOnlyList GetStateHistory() } } - /// - /// 回退到上一个状态 - /// - /// 如果成功回退则返回true,否则返回false - public bool GoBack() - { - var previousState = FindValidPreviousState(); - if (previousState == null) return false; - - ChangeInternalWithoutHistory(previousState); - return true; - } - /// /// 异步回退到上一个状态 /// /// 如果成功回退则返回true,否则返回false public async Task GoBackAsync() { - var previousState = FindValidPreviousState(); - if (previousState == null) return false; + await _transitionLock.WaitAsync(); + try + { + var previousState = FindValidPreviousState(); + if (previousState == null) return false; - await ChangeInternalWithoutHistoryAsync(previousState); - return true; + await ChangeInternalWithoutHistoryAsync(previousState); + return true; + } + finally + { + _transitionLock.Release(); + } } /// @@ -310,24 +273,6 @@ private void CompleteUnregister(IState stateToUnregister) } } - /// - /// 内部状态切换方法(不记录历史),用于回退操作 - /// - /// 下一个状态实例 - protected virtual void ChangeInternalWithoutHistory(IState next) - { - if (Current == next) return; - - var old = Current; - OnStateChanging(old, next); - - old?.OnExit(next); - Current = next; - Current.OnEnter(old); - - OnStateChanged(old, Current); - } - /// /// 异步内部状态切换方法(不记录历史),用于回退操作 /// @@ -346,32 +291,6 @@ protected virtual async Task ChangeInternalWithoutHistoryAsync(IState next) await OnStateChangedAsync(old, Current); } - /// - /// 内部状态切换方法,处理状态切换的核心逻辑 - /// - /// 下一个状态实例 - protected virtual void ChangeInternal(IState next) - { - if (Current == next) return; - - if (Current != null && !Current.CanTransitionTo(next)) - { - OnTransitionRejected(Current, next); - return; - } - - var old = Current; - OnStateChanging(old, next); - - AddToHistory(Current); - - old?.OnExit(next); - Current = next; - Current.OnEnter(old); - - OnStateChanged(old, Current); - } - /// /// 异步内部状态切换方法,处理状态切换的核心逻辑 /// @@ -383,12 +302,15 @@ protected virtual async Task ChangeInternalAsync(IState next) var old = Current; await OnStateChangingAsync(old, next); - AddToHistory(Current); - await ExecuteExitAsync(old, next); + + AddToHistory(old); + Current = next; + await ExecuteEnterAsync(Current, old); + await OnStateChangedAsync(old, Current); } diff --git a/GFramework.Core/state/StateMachineSystem.cs b/GFramework.Core/state/StateMachineSystem.cs index 6bed3bb9..1fbab8e6 100644 --- a/GFramework.Core/state/StateMachineSystem.cs +++ b/GFramework.Core/state/StateMachineSystem.cs @@ -71,22 +71,6 @@ public virtual void Destroy() States.Clear(); } - /// - /// 内部状态切换方法,重写基类方法以添加状态变更事件通知功能 - /// - /// 要切换到的下一个状态 - protected override void ChangeInternal(IState next) - { - var old = Current; - base.ChangeInternal(next); - - // 发送状态变更事件,通知监听者状态已发生改变 - this.SendEvent(new StateChangedEvent - { - OldState = old, - NewState = Current - }); - } /// /// 异步内部状态切换方法,重写基类方法以添加状态变更事件通知功能