Шрифт:
'Если затребована отмена выполнения, мы должны завершить задачу
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)
'Дать команду начать выполнение потока!
m_threadExecute = New ThreadExecuteTask(delegateCallCode)
End Sub
'Принудительно вызвать запрещенное изменение состояния (это приведет
'к возбуждению исключения)
Private Sub buttonCauseException_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles buttonCauseException.Click
m_threadExecute.setProcessingState( _
ThreadExecuteTask.ProcessingState.notYetStarted)
End Sub
'Послать асинхронному коду запрос с требованием отмены его выполнения
Private Sub buttonAbort_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles buttonAbort.Click
m_threadExecute.setProcessingState( _
ThreadExecuteTask.ProcessingState.requestAbort)
End Sub
'Проверить состояние выполнения
Private Sub buttonCheckStatus_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles ButtonCheckStatus.Click
'Запросить у класса управления потоком, в каком состоянии он находится
MsgBox(m_threadExecute.State.ToString)
'Запросить класс, метод которого выполняется в потоке,
'o состоянии выполнения
MsgBox(m_testMe.m_loopX.ToString)
End Sub
Листинг 9.4. Код, который должен быть помещен в класс Smartphone Form1.cs
'------------------------------------------------------
'Весь этот код должен находиться внутри класса Form1.cs
'------------------------------------------------------
'Объект, который будет выполнять все фоновые вычисления