Чтение онлайн

ЖАНРЫ

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

Салмре Иво

Шрифт:

//либо успешно завершена, либо успешно отменена

//------------------------------------------------------

if ((m_processingState == ProcessingState.aborted) ||

(m_processingState == ProcessingState.done)) {

return;

}

//Убедиться в допустимости данного изменения состояния

switch (nextState) {

case ProcessingState.notYetStarted:

throw new Exception("Переход
в состояние 'notYetStarted' невозможен");

case ProcessingState.waitingToStartAsync:

if (m_processingState != ProcessingState.notYetStarted) {

throw new Exception("Недопустимое изменение состояния");

}

break;

case ProcessingState.running:

if (m_processingState != ProcessingState.waitingToStartAsync) {

throw new Exception("Недопустимое изменение состояния");

}

break;

case ProcessingState.done:

//Мы можем завершить работу лишь тогда, когда она выполняется.

//Это возможно также в тех случаях, когда пользователь затребовал

//отмену выполнения, но работа к этому моменту уже была закончена

if ((m_processingState != ProcessingState.running) &&

(m_processingState != ProcessingState.requestAbort)) {

throw new Exception("Недопустимое изменение состояния");

}

break;

case ProcessingState.aborted:

if (m_processingState != ProcessingState.requestAbort) {

throw new Exception("Недопустимое изменение состояния");

}

break;

}

//Разрешить изменение состояния

m_processingState = nextState;

}

 }

 public ProcessingState State {

get {

ProcessingState currentState;

//Предотвратить попытки одновременного чтения/записи состояния

lock(m_useForStateMachineLock) {

currentState = m_processingState;

}

return currentState;

}

 }

} //Конец класса

В листинге 9.2 представлен код, имитирующий выполнение работы фоновым потоком. Когда фоновый поток начинает выполнять код, на экране отображается окно сообщения. Выполнение работы имитируется созданием серии пауз длительностью в одну треть секунды, в промежутках между которыми рабочий код проверяет, не поступил ли от другого потока запрос

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

Листинг 9.2. Тестовая программа для выполнения работы в фоновом потоке

using System;

//-------------------------------------------------

//Тестовый код, который используется для выполнения

//фоновым потоком

//-------------------------------------------------

public class Test1 {

 public int m_loopX;

 //------------------------------------------------------------------

 //Функция, вызываемая фоновым потоком

 // [in] threadExecute: Класс, управляющий выполнением нашего потока.

 // Мы можем контролировать его для проверки

 // того, не следует ли прекратить вычисления

 //------------------------------------------------------------------

 public void ThreadEntryPoint(ThreadExecuteTask threadExecute) {

//Это окно сообщений будет отображаться в контексте того потока,

//в котором выполняется задача

System.Windows.Forms.MessageBox.Show("Выполнение ТЕСТОВОГО ПОТОКА");

//------

//60 раз

//------

for (m_loopX = 0; m_loopX < 60; m_loopX++) {

//Если затребована отмена выполнения, мы должны завершить задачу

if (threadExecute.State == ThreadExecuteTask.ProcessingState.requestAbort) {

threadExecute.setProcessingState(ThreadExecuteTask.ProcessingState.aborted);

return;

}

//Имитировать выполнение работы: пауза 1/3 секунды

System.Threading.Thread.Sleep(333);

}

 }

} //Конец класса

В листинге 9.3 содержится код, который можно запустить на выполнение из основного потока пользовательского интерфейса с целью активизации и контроля фоновой обработки. Этот код не является независимым классом и должен помещаться в форму, с кнопками которой должны быть связаны события щелчков на кнопках.

Листинг 9.3. Код для запуска и тестирования приведенного выше тестового кода

//Класс, который будет управлять выполнением нового потока

private ThreadExecuteTask m_threadExecute;

//Класс, метод которого мы хотим выполнять в асинхронном режиме

Test1 m_testMe;

//----------------------------------------------------------

//Этот код должен быть запущен ранее другого кода, поскольку

Поделиться с друзьями: