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

> 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)


> 'Дать команду начать выполнение потока!

> m_threadExecute = New ThreadExecuteTask(delegateCallCode)

>End Sub


>'Принудительно вызвать запрещенное изменение состояния (это приведет

>'к возбуждению исключения)