>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)
> 'Если выполнение не было отменено, изменить состояние таким образом,