/// <summary> /// Допустимый ли переход состояний /// </summary> /// <param name="newState">Новое состояние</param> /// <param name="oldState">Старое состояние</param> /// <returns>Допустим переход</returns> private static bool IsValidStateTransition(ThreadPoolWorkItemState newState, ThreadPoolWorkItemState oldState) { switch (oldState) { case ThreadPoolWorkItemState.Created: return(newState == ThreadPoolWorkItemState.Started || newState == ThreadPoolWorkItemState.Cancelled); case ThreadPoolWorkItemState.Started: return(newState == ThreadPoolWorkItemState.Completed); case ThreadPoolWorkItemState.Completed: return(false); case ThreadPoolWorkItemState.Cancelled: return(false); } return(false); }
private void UpdateState(ThreadPoolWorkItemState newState) { #if DEBUG SpinWait sw = new SpinWait(); int curState = Volatile.Read(ref _state); while (IsValidStateTransition(newState, (ThreadPoolWorkItemState)curState)) { if (Interlocked.CompareExchange(ref _state, (int)newState, curState) == curState) { return; } sw.SpinOnce(); curState = Volatile.Read(ref _state); } throw new WrongStateException("Not allowed ThreadPoolWorkItem state change from '" + ((ThreadPoolWorkItemState)curState).ToString() + "' to '" + newState.ToString() + "'"); #endif }