Программирование мобильных устройств на платформе .NET Compact Framework
Шрифт:
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
'Если затребована отмена выполнения, мы должны завершить задачу
If (threadExecute.State = _
ThreadExecuteTask.ProcessingState.requestAbort) Then
threadExecute.setProcessingState( _
ThreadExecuteTask.ProcessingState.aborted)
Return
End If
'Имитировать выполнение работы: пауза 1/3 секунды
System.Threading.Thread.Sleep(333)
Next
End Sub
End Class
Листинг 9.3. Код для запуска и тестирования приведенного выше тестового кода
'Класс, который будет управлять выполнением нового потока
Private m_threadExecute As ThreadExecuteTask
'Класс, метод которого мы хотим выполнять в асинхронном режиме
Private m_testMe As Test1
'-----------------------------------------------------------------------
'Этот код должен быть запущен ранее другого кода, поскольку он запускает
'новый поток выполнения!
'
'Создать новый поток и обеспечить его выполнение
'-----------------------------------------------------------------------
Private Sub buttonStartAsyncExecution_Click(ByVal sender _
As System.Object, ByVal e As System.EventArgs) _
Handles buttonStartAsyncExecution.Click
'Создать экземпляр класса, метод которого мы хотим вызвать
'в другом потоке
m_testMe = New Test1
'Упаковать точку входа метода класса в делегат
Dim delegateCallCode As _
ThreadExecuteTask.ExecuteMeOnAnotherThread
delegateCallCode = _
New ThreadExecuteTask.ExecuteMeOnAnotherThread(AddressOf _
m_testMe.ThreadEntryPoint)
Поделиться с друзьями: