Шрифт:
'невозможность перехода в другое состояние, если задача либо
'успешно завершена, либо успешно отменена
'-----------------------------------------------------------
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
End Get
End Property
End Class
Листинг 9.2. Тестовая программа для выполнения работы в фоновом потоке
Option Strict On
Imports System
'---------------------------------------------------------
'Тестовый код, который используется для выполнения фоновым
'потоком
'---------------------------------------------------------
Public Class Test1
Public m_loopX As Integer
'------------------------------------------------------------------
'Функция, вызываемая фоновым потоком
' [in] threadExecute: Класс, управляющий выполнением нашего потока.
' Мы можем контролировать его для проверки
' того, не следует ли прекратить вычисления
'------------------------------------------------------------------
Public Sub ThreadEntryPoint(ByVal threadExecute As _
ThreadExecuteTask)
'Это окно сообщений будет отображаться в контексте того потока,
'в котором выполняется задача MsgBox("Выполнение ТЕСТОВОГО ПОТОКА")
'-------
' 60 раз
'-------
For m_loopX = 1 To 60