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

>Public Enum ProcessingState

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

> 'Начальное состояние

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

> 'Перечисляем возможные состояния

>  notYetStarted


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

> 'Рабочие состояния

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

> 'Ожидание запуска фонового потока

> waitingToStartAsync

> 'Выполнение кода в фоновом потоке

> running

> 'Запросить отмену выполнения вычислений

> requestAbort

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

> 'Состояния завершения

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

> 'Состояние завершения: выполнение фонового потока

> 'успешно завершено

> done

> 'Состояние завершения: выполнение потока отменено

> 'до его завершения

> aborted

>End Enum

>Private m_processingState As ProcessingState


>Public Delegate Sub ExecuteMeOnAnotherThread(_

> ByVal checkForAborts As ThreadExecuteTask)


>Private m_CallFunction As ExecuteMeOnAnotherThread

>Private m_useForStateMachineLock As Object


>Public Sub New(ByVal functionToCall As ExecuteMeOnAnotherThread)

> 'Создать объект, который мы можем использовать в конечном автомате

> 'в целях блокировки

> m_useForStateMachineLock = New Object


> 'Обозначить готовность к началу выполнения

> m_processingState = ProcessingState.notYetStarted


> 'Сохранить функцию, которую необходимо вызвать

> 'в новом потоке

> m CallFunction = functionToCall


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

> 'Создать новый поток и вызвать в нем функцию на выполнение:

> ' this.ThreadStartPoint()

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

> Dim threadStart As System.Threading.ThreadStart threadStart = _

>  New System.Threading.ThreadStart(AddressOf ThreadStartPoint)

> Dim newThread As System.Threading.Thread

> newThread = New System.Threading.Thread(threadStart)


> 'Обозначить готовность к началу выполнения (в целях определенности

> 'это важно сделать еще до того, как будет запущен поток!)

> setProcessingState(ProcessingState.waitingToStartAsync)


> 'Дать ОС команду начать выполнение нового потока в асинхронном режиме

> newThread.Start()

> 'Возвратить управление функции, вызывающей этот поток

>End Sub


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

>'Эта функция является точкой входа, вызываемой для

>'выполнения в новом потоке

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

>Private Sub ThreadStartPoint()

> 'Установить состояние обработки, соответствующее выполнению

> 'функции в новом потоке!

> setProcessingState(ProcessingState.running)

> 'Запустить на выполнение пользовательский код и передать указатель в наш

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

> 'на прекращение выполнения

> m_CallFunction (Me)


> 'Если выполнение не было отменено, изменить состояние таким образом,