Программирование мобильных устройств на платформе .NET Compact Framework (Салмре) - страница 542

> 'чтобы оно соответствовало успешному завершению

> If (m_processingState <> ProcessingState.aborted) Then

>  'Обозначить завершение выполнения

>  setProcessingState(ProcessingState.done)

> End If


> 'Выйти из потока...

>End Sub


>'----------------

>'Конечный автомат

>'----------------

>Public Sub setProcessingState(ByVal nextState As _

> ProcessingState)

> 'В любой момент времени только одному потоку выполнения могут быть

> 'разрешены попытки изменить состояние

> SyncLock (m_useForStateMachineLock)

>  'В случае попытки повторного вхождения в текущее состояние

>  'никакие дополнительные действия не выполняются

>  If (m_processingState = nextState) Then

>   Return

>  End If

>  '-----------------------------------------------------------

>  'Простейший защитный код, гарантирующий

>  'невозможность перехода в другое состояние, если задача либо

>  'успешно завершена, либо успешно отменена

>  '-----------------------------------------------------------

>  If ((m_processingState = ProcessingState.aborted) OrElse _

>   (m_processingState = ProcessingState.done)) Then

>   Return

>  End If


>  'Убедиться в допустимости данного изменения состояния

>  Select Case (nextState)

>  Case ProcessingState.notYetStarted

>   Throw New Exception _

>    ("Переход в состояние 'notYetStarted' невозможен")

>  Case ProcessingState.waitingToStartAsync

>   If (m_processingState <> ProcessingState.notYetStarted) Then

>    Throw New Exception("Недопустимое изменение состояния")

>   End If

>  Case ProcessingState.running

>   If (m_processingState <> _

>    ProcessingState.waitingToStartAsync) Then

>    Throw New Ехсерtion("Недопустимое изменение состояния")

>   End If

>  Case ProcessingState.done

>   'Мы можем завершить работу лишь тогда, когда она выполняется.

>   'Это возможно также в тех случаях, когда пользователь затребовал

>   'отмену выполнения, но работа к этому моменту уже была закончена

>   If ((m_processingState <> ProcessingState.running) AndAlso _

>    (m_processingState <> ProcessingState.requestAbort)) Then

>    Throw New Exception("Недопустимое изменение состояния")

>   End If

>  Case ProcessingState.aborted

>   If (m_processingState <> ProcessingState.requestAbort) Then

>    Throw New Exception("Недопустимое изменение состояния")

>   End If

>  End Select


>  'Разрешить изменение состояния

>  m_processingState = nextState

> End SyncLock

>End Sub


>Public ReadOnly Property State() As ProcessingState

> Get

>  Dim currentState As ProcessingState

>  'Предотвратить попытки одновременного чтения/записи состояния

>  SyncLock (m_useForStateMachineLock)

>   currentState = m_orocessingState

>  End SyncLock

>  Return currentState